home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
tools
/
rb
/
jydrv220.lzh
/
JOYDRV.S
< prev
next >
Wrap
Text File
|
1999-08-09
|
79KB
|
3,197 lines
.cpu 68000
JOY_MAX equ 7 * 接続可能パット数
RCV_BUF_SIZE equ 1024 * 受信バッファサイズ
DATA_SIZE equ 256 * データサイズ
PAD_TYPE_ATARI equ $0000 * パッドタイプ = アタリ
PAD_TYPE_MD equ $0001 * パッドタイプ = メガドライブ
PAD_TYPE_SS equ $0002 * パッドタイプ = サターン
PAD_TYPE_PS equ $0003 * パッドタイプ = プレイステーション
PAD_TYPE_NOTAP equ $0000 * マルチタップ無し
PAD_TYPE_MTAP equ $0100 * マルチタップ有り
COM_DATA_INIT .macro
.dc.l 0 * ドライバ JOYDRV
.dc.l 0 * 現在処理中のバッファ領域
.dc.l 0 * データを出力するバッファ領域
.dc.w JOY_MAX-1 * JOY STICKポート1 最大パッド数
.dc.w 2 * マルチタップ判定を行う(キャッシュあり)
.dc.w 1 * JOYDRV拡張モード
.dc.w 0 * WAIT補正値
.dcb.b RCV_BUF_SIZE,$00 * 受信バッファ
.endm
JOY_DATA_INIT .macro
.dc.l $FFFFFFFF * パッドタイプ = 不明
.dc.w $ffff * データはキャッシュされていない(キャッシュしているパッドタイプ)
.dc.w $ffff * 読み込みポート($0000:ポート1 $0002:ポート2 $ffff:読み込み無し)
.dc.l 0 * 送信データアドレス
.dc.w $ffff * デジタルデータ
.dc.w $00ff * アナログデータ有効範囲
.dc.b $80 * 左・上下
.dc.b $80 * 左・左右
.dc.b $80 * 右・上下
.dc.b $80 * 右・左右
.dc.b $00 * ボタン1
.dc.b $00 * ボタン2
.dc.b $00 * ボタン3
.dc.b $00 * ボタン4
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.b $00,$00 * ON:OFFカウント
.dc.l $ffffffff * PSパッドアクセス間隔計測用
.dc.w $0000 * プレイステーション振動パッドステータス
.dcb.b 66,$00 * 予備(+1=128)
.dc.w 0 * ビット変換無し
.dc.l $0003004f * 十字キーエミュレート(上下左右,しきい値$4F)
.dc.w 0 * モーター振動ステータス
.dc.w 0 * START,SELECTボタンモード(通常)
.dc.w $fffe * 変換データ
.dc.w $fffd * 変換データ
.dc.w $fffb * 変換データ
.dc.w $fff7 * 変換データ
.dc.w $ffef * 変換データ
.dc.w $ffdf * 変換データ
.dc.w $ffbf * 変換データ
.dc.w $ff7f * 変換データ
.dc.w $feff * 変換データ
.dc.w $fdff * 変換データ
.dc.w $fbff * 変換データ
.dc.w $f7ff * 変換データ
.dc.w $efff * 変換データ
.dc.w $dfff * 変換データ
.dc.w $bfff * 変換データ
.dc.w $7fff * 変換データ
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dc.b $00,$00 * 連射モード(ON数:OFF数)
.dcb.b 54,$00 * 末端+1 = 256
.endm
.offset 0 * 共通データ領域フォーマット
COM_CTRL_DRV:
.ds.l 1 * 制御ドライバ指定
COM_DIS_JOYBUF:
.ds.l 1 * 現在処理中のバッファ領域
COM_OUT_JOYBUF:
.ds.l 1 * データを出力するバッファ領域
COM_JOY1_MAX:
.ds.w 1 * JOY STICKポート1 最大パッド数
COM_HANTEI_MODE:
.ds.w 1 * パッド接続ケーブル/マルチタップ判定モード
COM_IOCS3B_OUT:
.ds.w 1 * IOCS$3B出力モード
COM_WAIT_HOSEI:
.ds.w 1 * WAIT補正値
COM_RCV_BUF:
.ds.b RCV_BUF_SIZE * 受信バッファ
.offset 0 * ジョイスティック別データ領域フォーマット
JOY_PAD_TYPE:
.ds.l 1 * パッドタイプ
JOY_CACHE_STS:
.ds.w 1 * マルチタップキャッシュ制御
JOY_PORT_NO:
.ds.w 1 * ポート番号
JOY_SND_BUF:
.ds.l 1 * 送信バッファアドレス
JOY_D_DATA:
.ds.w 1 * デジタルデータ
JOY_ANALOG_FLG:
.ds.w 1 * アナログデータ有効フラグ
JOY_LUD_DATA:
.ds.b 1 * 左・上下
JOY_LLR_DATA:
.ds.b 1 * 左・左右
JOY_RUD_DATA:
.ds.b 1 * 右・上下
JOY_RLR_DATA:
.ds.b 1 * 右・左右
JOY_BTN1_DATA:
.ds.b 1 * ボタン1
JOY_BTN2_DATA:
.ds.b 1 * ボタン2
JOY_BTN3_DATA:
.ds.b 1 * ボタン3
JOY_BTN4_DATA:
.ds.b 1 * ボタン4
JOY_ONOFF_CNT:
.ds.w 16 * 連射モードON:OFFカウント
JOY_PS_MOTOR_TIME:
.ds.l 1 * PSパッドアクセス間隔計測用
JOY_PS_MOTOR_STS:
.ds.w 1 * プレイステーション振動パッドステータス
JOY_YOBI_001:
.ds.b 66 * 予約領域(66バイト)
JOY_CNV_MODE:
.ds.w 1 * ビット変換モード
JOY_PLUS_EMU:
.ds.l 1 * アナログスティック -> 十字キーエミュレート
JOY_MOTOR_STS:
.ds.w 1 * モーターステータス
JOY_STASEL_MODE:
.ds.w 1 * START,SELECTボタンモード
JOY_CNV_DATA:
.ds.w 16 * ビット変換データ
JOY_ONOFF_SU:
.ds.w 16 * 連射モードON:OFF数
JOY_YOBI_002:
.ds.b 54 * 予約領域(54バイト)
.text
DEVHEAD:
.dc.l $ffffffff * リンクポインタ
.dc.w $8020 * デバイス属性
.dc.l STRTG_RTN * ストラテジルーチンアドレス
.dc.l DEV_RTN * ドライバルーチンアドレス
KEEP_CHK_NAME:
.dc.b 'JOYDRV*/' * デバイス名
KEEP_CHK_VER:
.dc.b $02,$02,$00,' ' * バージョン(X.XXY) X:数値 Y:アルファベット
* D0 : ワーク(デジタルデータ)
* D1 : ジョイスティク番号
* D2 : ワーク
* D3 : ワーク
* D4 : ワーク
* D5 : ワーク
* D6 : ワーク
* A0 : サブルーチン用引き数(ワーク)
* A1 : $e9a001
* A2 : $e9a007
* A3 : バッファアドレス
* A4 : ワーク
IOCS3B: * IOCS3B処理
tst.w d1
bmi MODECNV_RTN * モード変更か?
movem.l d1-d6/a1-a4,-(a7) * レジスタ保存
lea.l $e9a001,a1 * ジョイスティックI/Oアドレス
lea.l 6(a1),a2 * ジョイスティックI/Oアドレス
move.w COM_DATA+COM_HANTEI_MODE(pc),d0
beq ATARI68 * アタリ他68通常パッド読み込み
move.b #9,(a2) * ON
tst.b (a1) * WAIT
move.b (a1),d0
andi.b #$0f,d0
cmpi.b #2,d0
beq PS_CABLE * プレイステーション接続ケーブルか?
cmpi.b #1,d0
beq SATURN_EXT * セガサターンマルチタップまたはマルチコンか?
cmpi.b #3,d0
beq MD_MTAP * メガドライブマルチタップか?
tst.w d1
bne ATARI68
andi.b #7,d0 * 下位3ビット有効
cmpi.b #4,d0
beq SATURN_NORMAL * サターンパットか?
ATARI68: * アタリ他68通常パッド読み込み
moveq.l #$ff,d0 * パッドタイプ = 不明
cmpi.w #2,d1
bcc IOCS3B_ERROR * ジョイスティック番号が範囲外か?
move.w d1,d0
add.w d0,d0 * ジョイスティック番号*2
ATARI68_1: * ここに飛ぶには、d0に(0,2)とd1にJOY番号をセットすること
moveq.l #8,d2
add.b d0,d2 * ビットOFF情報取得
moveq.l #9,d3
add.b d0,d3 * ビットON情報取得
moveq.l #0,d4 * パッドタイプ = アタリ
adda.w d0,a1
lsl.w #8,d1
lea.l JOY_DATA(pc),a0
adda.w d1,a0
move.w d0,JOY_PORT_NO(a0) * ポート番号設定
move.w sr,d5 * SRレジスタ保持
ori.w #$0700,sr * 割り込み禁止
move.b d3,(a2) * ON
move.b d2,(a2) * OFF
move.b d3,(a2) * ON
move.b d2,(a2) * OFF
move.b d3,(a2) * ON
moveq.l #$ff,d0 * WAIT
tst.b (a1)
move.b (a1),d0 * ポート読み込み
move.b d2,(a2) * OFF
move.b d0,d2 * WAIT
tst.b (a1)
move.b (a1),d0 * ポート読み込み
move.b d3,(a2) * ON
move.b d0,d3
tst.w JOY_STASEL_MODE(a0)
bne ATARI68_3 * START,SELECTボタンがFM-TOWNSモードか?
andi.b #$0c,d0
bne ATARI68_3 * 変換コネクタを使用していないか?
move.b (a1),d1 * 6ボタン情報読み込み
move.l #PAD_TYPE_MD*65536+PAD_TYPE_NOTAP+$01,d4 * パッドタイプ = メガドラ6B
move.b d3,d0
andi.b #$0f,d0
beq ATARI68_2 * 6ボタンか?
st.b d1 * 3ボタンの時,6ボタンの位置を無効にする
clr.b d4 * パッドタイプ = メガドラ3B
ATARI68_2:
ori.b #$f0,d1 * 未使用ビット消去
ori.b #$0f,d3 * 未使用ビット消去
and.b d1,d3 * アダプタと同じ情報を生成する
exg.l d3,d2 * 情報交換
ATARI68_3:
move.w d5,sr * SRレジスタ復帰
move.b d2,d0
lsl.w #8,d0
move.b d2,d0
lsl.b #1,d0
asr.b #2,d0
ori.w #$f06f,d0 * 6ボタン情報とSTARTとAボタンのみにする(bit 7..START bit 4..A)
and.b d3,d0 * 十字キーの情報にSTARTとAボタン情報を付加する
tst.w JOY_STASEL_MODE(a0)
bne ATARI68_4 * START,SELECTボタンがFM-TOWNSモードか?
btst.l #11,d0
bne ATARI68_10
andi.w #$7fff,d0
bra ATARI68_10
ATARI68_4:
ori.b #$80,d0
move.b d0,d2
andi.b #$0c,d2
bne ATARI68_5
andi.b #$7f,d0
ori.b #$0c,d0
ATARI68_5:
move.b d0,d2
andi.b #$03,d2
bne ATARI68_10
andi.w #$7fff,d0
ori.b #$03,d0
ATARI68_10:
move.l a0,COM_DATA+COM_OUT_JOYBUF
move.l d4,JOY_PAD_TYPE(a0) * パッドタイプ保存
move.w #$ffff,JOY_CACHE_STS(a0) * キャッシュ無し
move.w d0,JOY_D_DATA(a0) * デジタルデータ
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み無し
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
bsr LENSHA_MODE
bsr BIT_CNV_MODE
IOCS3B_SET:
movea.l COM_DATA+COM_OUT_JOYBUF(pc),a0
move.w COM_DATA+COM_IOCS3B_OUT(pc),d1
bne IOCS3B_SET_1
moveq.l #0,d0
move.b JOY_D_DATA+1(a0),d0 * デジタルデータ
ori.b #$90,d0
bra IOCS3B_END
IOCS3B_SET_1:
moveq.l #$ff,d0
move.w JOY_D_DATA(a0),d0 * デジタルデータ
IOCS3B_END: * IOCS3B処理終了
movem.l (a7)+,d1-d6/a1-a4 * レジスタ復帰
rts
IOCS3B_ERROR: * D1.W にJOY番号を格納
cmpi.w #JOY_MAX,d1
bcc IOCS3B_ERROR_10
lsl.w #8,d1
lea.l JOY_DATA(pc),a0
adda.w d1,a0
moveq.l #$ff,d0
move.l a0,COM_DATA+COM_OUT_JOYBUF
move.l d0,JOY_PAD_TYPE(a0) * パッドタイプ不明
move.w d0,JOY_PORT_NO(a0) * ポート番号(読み込み無し)
move.w d0,JOY_CACHE_STS(a0) * キャッシュ無し
move.w d0,JOY_D_DATA(a0) * デジタルデータ
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み無し
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
IOCS3B_ERROR_10:
moveq.l #0,d0 * エラー
bra IOCS3B_END
* D4-6 : 破壊
* A4 : 破壊
LENSHA_MODE:
move.l a3,-(a7)
lea.l JOY_ONOFF_SU(a0),a3
lea.l JOY_ONOFF_CNT(a0),a4
move.w JOY_D_DATA(a0),d4
moveq.l #0,d5
moveq.l #16-1,d6
LENSHA_MODE_1:
btst.l d5,d4
bne LENSHA_MODE_10
tst.w (a3)
beq LENSHA_MODE_11
LENSHA_MODE_2:
tst.b (a4)
beq LENSHA_MODE_3
subq.b #1,(a4)
bra LENSHA_MODE_11
LENSHA_MODE_3:
tst.b 1(a4)
beq LENSHA_MODE_4
subq.b #1,1(a4)
bset.l d5,d4
bra LENSHA_MODE_11
LENSHA_MODE_4:
move.w (a3),(a4)
bra LENSHA_MODE_2
LENSHA_MODE_10:
move.w (a3),(a4)
LENSHA_MODE_11:
addq.w #2,a3
addq.w #2,a4
addq.b #1,d5
dbra d6,LENSHA_MODE_1
move.w D4,JOY_D_DATA(a0)
movea.l (a7)+,a3
rts
* D4-6 : 破壊
* A4 : 破壊
BIT_CNV_MODE:
tst.w JOY_CNV_MODE(a0)
beq BIT_CNV_MODE_3
lea.l JOY_CNV_DATA+30(a0),a4
moveq.l #15,d6
moveq.l #$ff,d5
move.w JOY_D_DATA(a0),d4
BIT_CNV_MODE_1:
btst.l d6,d4
bne BIT_CNV_MODE_2
and.w (a4),d5
BIT_CNV_MODE_2:
subq.w #2,a4
dbra d6,BIT_CNV_MODE_1
move.w d5,JOY_D_DATA(a0)
BIT_CNV_MODE_3:
rts
* D4-D6 : 破壊
*
PLUS_EMU_SET: * 十字キーエミュレート設定
move.w JOY_PLUS_EMU(a0),d6
and.w JOY_ANALOG_FLG(a0),d6
move.w JOY_PLUS_EMU+2(a0),d5
btst.l #1,d6
beq PLUS_EMU_SET_2
move.b JOY_LLR_DATA(a0),d4
bmi PLUS_EMU_SET_1
cmp.b d5,d4
bgt PLUS_EMU_SET_2
andi.w #$fffb,JOY_D_DATA(a0) * 左キーエミュレート
bra PLUS_EMU_SET_2
PLUS_EMU_SET_1:
not.b d4
cmp.b d5,d4
bgt PLUS_EMU_SET_2
andi.w #$fff7,JOY_D_DATA(a0) * 右キーエミュレート
PLUS_EMU_SET_2:
btst.l #0,d6
beq PLUS_EMU_SET_4
move.b JOY_LUD_DATA(a0),d4
bmi PLUS_EMU_SET_3
cmp.b d5,d4
bgt PLUS_EMU_SET_4
andi.w #$fffe,JOY_D_DATA(a0) * 上キーエミュレート
bra PLUS_EMU_SET_4
PLUS_EMU_SET_3:
not.b d4
cmp.b d5,d4
bgt PLUS_EMU_SET_4
andi.w #$fffd,JOY_D_DATA(a0) * 下キーエミュレート
PLUS_EMU_SET_4:
btst.l #3,d6
beq PLUS_EMU_SET_6
move.b JOY_RLR_DATA(a0),d4
bmi PLUS_EMU_SET_5
cmp.b d5,d4
bgt PLUS_EMU_SET_6
andi.w #$fbff,JOY_D_DATA(a0) * 左キーエミュレート
bra PLUS_EMU_SET_6
PLUS_EMU_SET_5:
not.b d4
cmp.b d5,d4
bgt PLUS_EMU_SET_6
andi.w #$f7ff,JOY_D_DATA(a0) * 右キーエミュレート
PLUS_EMU_SET_6:
btst.l #2,d6
beq PLUS_EMU_SET_8
move.b JOY_RUD_DATA(a0),d4
bmi PLUS_EMU_SET_7
cmp.b d5,d4
bgt PLUS_EMU_SET_8
andi.w #$feff,JOY_D_DATA(a0) * 上キーエミュレート
bra PLUS_EMU_SET_8
PLUS_EMU_SET_7:
not.b d4
cmp.b d5,d4
bgt PLUS_EMU_SET_8
andi.w #$fdff,JOY_D_DATA(a0) * 下キーエミュレート
PLUS_EMU_SET_8:
rts
SATURN_NORMAL: * サターン,ノーマルパッド読み込み
moveq.l #$ff,d0 * データ初期化
moveq.l #8,d2
move.b (a1),d0 * ポート読み込み(Lボタン)
move.b d2,(a2) * PC4 = 0
moveq.l #9,d3
lsl.w #8,d1
lea.l JOY_DATA(pc),a0
adda.w d1,a0
lsl.b #1,d0
ori.b #$e0,d0 * Lボタンのみ有効にする
tst.b (a1) * WAIT
move.b (a1),d4 * ポート読み込み(上,下,左,右)
move.b d3,(a2) * PC4 = 1
move.b #$d,(a2) * PC6 = 1
andi.b #$0f,d4 * 方向キーのみを有効にする
andi.b #$f0,d0 * WAIT
tst.b (a1) * WAIT
move.b (a1),d1 * ポート読み込み(START,A,C,B)
move.b d2,(a2) * PC4 = 0
lsl.b #4,d1
or.b d1,d4 * 上,下,左,右 + START,A,C,B
tst.b (a1) * WAIT
move.b (a1),d1 * ポート読み込み(Rボタン,X,Y,Z)
move.b d3,(a2) * PC4 = 1
move.b #$c,(a2) * PC6 = 0
andi.b #$0f,d1 * ボタンのみを有効にする
or.b d1,d0 * L + R,X,Y,Z
lsl.w #8,d0 * L,R,X,Y,Zを上位に
move.b d4,d0 * 全データセット
move.l a0,COM_DATA+COM_OUT_JOYBUF
move.l #PAD_TYPE_SS*65536,JOY_PAD_TYPE(a0) * パッドタイプ = サターンデジタル(マルチタップ無し)
clr.w JOY_PORT_NO(a0) * ポート番号設定(PORT1)
move.w #$ffff,JOY_CACHE_STS(a0) * キャッシュ無し
move.w d0,JOY_D_DATA(a0) * デジタルデータ
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み無し
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
bsr LENSHA_MODE
bsr BIT_CNV_MODE
bra IOCS3B_SET
SATURN_EXT: * サターン,マルチタップ読み込み
move.b #8,(a2) * PC4 = 0
moveq.l #4,d0
bsr JOY_WAIT
move.l #PAD_TYPE_SS*65536,d2 * パッドタイプ = サターン
moveq.l #1,d3 * 接続コントローラ数
SATURN_EXT_1:
bsr SATURN_GETDATA * データ読み込み
cmpi.b #4,d5
bne SATURN_EXT_2 * マルチタップ以外か?
bsr SATURN_GETDATA * データ読み込み
move.w d5,d3 * 接続コントローラ数設定
move.w #PAD_TYPE_MTAP,d2 * パッドタイプ = サターン + マルチタップ
bra SATURN_EXT_1
SATURN_EXT_2:
cmp.w COM_DATA+COM_JOY1_MAX(pc),d3
ble SATURN_EXT_3
move.w COM_DATA+COM_JOY1_MAX(pc),d3
SATURN_EXT_3:
cmp.w d3,d1
beq SATURN_EXT_ERROR3 * タップ最大数+1
bgt SATURN_EXT_ERROR2 * JOY番号範囲外
lea.l JOY_DATA(pc),a0
move.w d1,d0
lsl.w #8,d0
adda.w d0,a0 * 対象JOY番号のデータ領域
move.l a0,COM_DATA+COM_OUT_JOYBUF * 出力バッファ
cmpi.w #1,COM_DATA+COM_HANTEI_MODE
beq SATURN_EXT_4 * キャッシュ無し指定か
cmpi.w #PAD_TYPE_SS,JOY_CACHE_STS(a0)
beq SATURN_EXT_9 * サターンでキャッシュされているデータがあるか
SATURN_EXT_4:
lea.l JOY_DATA(pc),a0
lea.l COM_DATA+COM_RCV_BUF(pc),a3 * 受信バッファ
subq.w #1,d3
bra SATURN_EXT_6
SATURN_EXT_5:
lea.l DATA_SIZE(a0),a0 * 次のJOY番号のデータ領域
bsr SATURN_GETDATA * データ読み込み
SATURN_EXT_6:
movea.l a3,a4
move.b d5,d2
move.b d5,(a3)+ * コントローラタイプ
move.b d6,(a3)+ * 転送バイト数
cmpi.b #$f,d5
beq SATURN_EXT_8 * コントローラが未接続か
move.w d6,d4 * 転送バイト数設定
subq.w #1,d4
SATURN_EXT_7:
bsr SATURN_GETDATA * データ読み込み
lsl.b #4,d5
or.b d5,d6
move.b d6,(a3)+ * データセット
dbra d4,SATURN_EXT_7
SATURN_EXT_8:
move.l d2,JOY_PAD_TYPE(a0)
move.w #PAD_TYPE_SS,JOY_CACHE_STS(a0) * キャッシュあり
clr.w JOY_PORT_NO(a0) * ポート番号設定(PORT1)
moveq.l #0,d0
move.b (a4)+,d0 * コントローラタイプ取得
add.w d0,d0 * 2倍
move.w SATURN_PADTYPE(pc,d0.w),d0
jsr SATURN_PADTYPE(pc,d0.w) * タイプ別処理に飛ぶ
dbra d3,SATURN_EXT_5
SATURN_EXT_9:
move.b #9,(a2) * PC4 = 1
movea.l COM_DATA+COM_OUT_JOYBUF(pc),a0
move.w #$ffff,JOY_CACHE_STS(a0) * キャッシュ無し
bra IOCS3B_SET
SATURN_PADTYPE:
.dc.w SATURN_DIGITAL-SATURN_PADTYPE * デジタルパッド
.dc.w SATURN_ANALOG-SATURN_PADTYPE * アナログパッド
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_RESERVE-SATURN_PADTYPE * マルチタップ
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_RESERVE-SATURN_PADTYPE * ?
.dc.w SATURN_NOPAD-SATURN_PADTYPE * 未接続
SATURN_DIGITAL:
SATURN_ANALOG:
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み情報クリア
move.b (a4)+,d6 * 転送バイト数
move.b (a4)+,d0 * 上、下、左、右 + B、C、A、STARTの読み込み
ror.b #4,d0
move.b d0,JOY_D_DATA+1(a0)
move.b (a4)+,d0 * X、Y、Z、R + Lの読み込み
move.b d0,d5
lsr.b #4,d0
ori.b #$e0,d0
lsl.b #1,d5
andi.b #$10,d5
or.b d5,d0
move.b d0,JOY_D_DATA(a0)
subq.b #2,d6
beq SATURN_ANALOG_1
move.b (a4)+,JOY_LLR_DATA(a0) * 左右アナログ値セット
ori.b #$02,JOY_ANALOG_FLG+1(a0) * 左右アナログ値有効
subq.b #1,d6
beq SATURN_ANALOG_2
move.b (a4)+,JOY_LUD_DATA(a0) * 上下アナログ値セット
ori.b #$01,JOY_ANALOG_FLG+1(a0) * 上下アナログ値有効
subq.b #1,d6
beq SATURN_ANALOG_3
move.b (a4)+,JOY_BTN1_DATA(a0) * Rアナログ値セット
ori.b #$10,JOY_ANALOG_FLG+1(a0) * Rアナログ値有効
subq.b #1,d6
beq SATURN_ANALOG_4
move.b (a4)+,JOY_BTN2_DATA(a0) * Lアナログ値セット
ori.b #$20,JOY_ANALOG_FLG+1(a0) * Lアナログ値有効
bra SATURN_ANALOG_5
SATURN_ANALOG_1:
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
SATURN_ANALOG_2:
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
SATURN_ANALOG_3:
clr.b JOY_BTN1_DATA(a0) * ボタン1
SATURN_ANALOG_4:
clr.b JOY_BTN2_DATA(a0) * ボタン2
SATURN_ANALOG_5:
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
bsr LENSHA_MODE
bsr BIT_CNV_MODE * ビット変換
bsr PLUS_EMU_SET * 十字キーエミュレート設定
rts
SATURN_RESERVE:
SATURN_NOPAD:
move.w #$ffff,JOY_D_DATA(a0) * デジタルデータ
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み無し
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
rts
SATURN_GETDATA:
move.b #$d,(a2) * PC6 = 1
moveq.l #$7f,d0
SATURN_GETDATA_1:
btst.b #6,(a1)
dbeq d0,SATURN_GETDATA_1 * ステータス待ち
bne SATURN_EXT_ERROR1 * ケーブル接続エラー
move.b (a1),d5 * データ読み込み
move.b #$c,(a2) * PC6 = 0
andi.w #$000f,d5 * 下位4ビットのみ有効
moveq.l #$7f,d0
SATURN_GETDATA_2:
btst.b #6,(a1)
dbne d0,SATURN_GETDATA_2 * ステータス待ち
beq SATURN_EXT_ERROR1 * ケーブル接続エラー
move.b (a1),d6 * データ読み込み
andi.w #$000f,d6 * 下位4ビットのみ有効
rts
SATURN_EXT_ERROR1:
addq.w #4,a7 * rts分補正
move.b #$c,(a2) * PC6 = 0
move.b #9,(a2) * PC4 = 1
bra ATARI68 * アタリパッドの読み込み
SATURN_EXT_ERROR2:
move.b #9,(a2) * PC4 = 1
bra IOCS3B_ERROR
SATURN_EXT_ERROR3:
move.b #9,(a2) * PC4 = 1
moveq.l #2,d0 * JOYSTICK PORT 1
bra ATARI68_1
PS_CABLE_ERROR1:
moveq.l #2,d0 * JOYSTICK PORT 1
bra ATARI68_1
PS_CABLE:
move.w COM_DATA+COM_JOY1_MAX(pc),d2
cmpi.w #JOY_MAX-1,d2
ble PS_CABLE_1
moveq.l #JOY_MAX-1,d2
PS_CABLE_1:
cmp.w d2,d1
beq PS_CABLE_ERROR1 * マルチタップ最大数+1
bgt IOCS3B_ERROR * JOY番号が範囲外か
move.b #8,(a2) * PC4 = 0
move.w d1,d0
lsl.w #8,d0
lea.l JOY_DATA(pc),a0
adda.w d0,a0 * 対象JOY番号のデータ領域
move.l a0,COM_DATA+COM_OUT_JOYBUF * 出力バッファ
moveq.l #11,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
move.w d1,d4
addq.w #1,d4 * 読み込みパッド位置指定
bsr PS_IF_PAD * 通信
cmpi.w #PAD_TYPE_PS,JOY_PAD_TYPE(a0)
bne PS_CABLE_2 * パッドがPS以外だったか
cmpi.b #$0f,JOY_PAD_TYPE+3(a0)
beq PS_CABLE_2 * パッドが未接続だったか
movea.l #$e8a000,a4 * RTC
move.b $1b(a4),d0
andi.b #$fe,d0
tst.b (a1)
tst.b (a1)
tst.b (a1)
move.b d0,$1b(a4)
tst.b (a1)
tst.b (a1)
tst.b (a1)
PS_MOTOR_TIMER_1:
moveq.l #$1,d4
moveq.l #$6-1,d5
PS_MOTOR_TIMER_2:
move.b 0(a4,d4.w),d0
ror.l #4,d0
addq.w #2,d4
dbra d5,PS_MOTOR_TIMER_2
lsr.l #8,d0
moveq.l #$1,d4
moveq.l #$6-1,d5
PS_MOTOR_TIMER_3:
move.b 0(a4,d4.w),d6
ror.l #4,d6
addq.w #2,d4
dbra d5,PS_MOTOR_TIMER_3
lsr.l #8,d6
cmp.l d0,d6
bne PS_MOTOR_TIMER_1
sub.l JOY_PS_MOTOR_TIME(a0),d0
move.l d6,JOY_PS_MOTOR_TIME(a0)
cmpi.l #2,d0
bcs PS_CABLE_3 * 2秒以内アクセスか
PS_CABLE_2:
bsr SET_PS_MOTOR_SND * PSモーターコマンド送信パラメータ設定
PS_CABLE_3:
movea.l JOY_SND_BUF(a0),a4
movea.l (a4),a4 * データアドレス取得
move.w JOY_MOTOR_STS(a0),d0
andi.w #$01ff,d0
tst.b JOY_PS_MOTOR_STS(a0)
bne PS_CABLE_4 * デュアルショックか
lsr.w #8,d0
ori.w #$4000,d0
PS_CABLE_4:
move.w d0,PS_SND_NORMAL_DATA000+2 * モーターステータスセット
move.b (a4)+,d4 * コマンド1バイト取り出し
bsr PS_IF_PAD * 通信
cmpi.b #$ff,d4
beq PS_CABLE_ERROR2
lea.l COM_DATA+COM_RCV_BUF(pc),a3 * 受信バッファ
move.l #PAD_TYPE_PS*65536,d2 * パッドタイプ = PS
move.b d4,d2
lsr.b #4,d2
move.b d2,(a3)+ * コントローラタイプ
andi.w #$000f,d4
add.b d4,d4
move.b d4,(a3)+ * 転送バイト数
move.w d4,d3
PS_CABLE_11:
move.b (a4)+,d4 * コマンド1バイト取り出し
bsr PS_IF_PAD * 通信
move.b d4,(a3)+
dbra d3,PS_CABLE_11
PS_CABLE_20:
move.b #9,(a2) * PC4 = 1
move.w #$ffff,JOY_CACHE_STS(a0) * キャッシュ無し
clr.w JOY_PORT_NO(a0) * ポート番号設定(PORT1)
movea.l JOY_SND_BUF(a0),a4
movea.l 6(a4),a4
move.l a4,JOY_SND_BUF(a0) * 次のデータアドレス
lea.l COM_DATA+COM_RCV_BUF+1(pc),a3 * 受信バッファ
move.b d2,d0
andi.w #$00ff,d0
add.w d0,d0 * 2倍
move.w PS_PADTYPE(pc,d0.w),d0
jmp PS_PADTYPE(pc,d0.w) * タイプ別処理に飛ぶ
PS_CABLE_ERROR2:
move.l #PAD_TYPE_PS*65536+$0f,JOY_PAD_TYPE(a0) * パッドタイプ = PS無接続
lea.l PS_SND_NORMAL_000(pc),a4 * 通常パラメータ
move.l a4,JOY_SND_BUF(a0)
clr.b JOY_PS_MOTOR_STS(a0)
move.b #9,(a2) * PC4 = 1
clr.w JOY_PORT_NO(a0) * ポート番号(PORT1)
moveq.l #$ff,d0
move.w d0,JOY_CACHE_STS(a0) * キャッシュ無し
move.w d0,JOY_D_DATA(a0) * デジタルデータ
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み無し
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
bra IOCS3B_SET
PS_PADTYPE:
.dc.w PS_RESERVE-PS_PADTYPE * ?
.dc.w PS_MOUSE-PS_PADTYPE * マウス
.dc.w PS_ANALOG1-PS_PADTYPE * アナログパッド(1STICK)
.dc.w PS_RESERVE-PS_PADTYPE * ?
.dc.w PS_DIGITAL-PS_PADTYPE * デジタルパッド
.dc.w PS_ANALOG2-PS_PADTYPE * アナログパッド(2STICK)
.dc.w PS_RESERVE-PS_PADTYPE * ?
.dc.w PS_ANALOG2-PS_PADTYPE * アナログパッド(2STICK)
.dc.w PS_RESERVE-PS_PADTYPE * ?
.dc.w PS_RESERVE-PS_PADTYPE * ?
.dc.w PS_RESERVE-PS_PADTYPE * ?
.dc.w PS_RESERVE-PS_PADTYPE * ?
.dc.w PS_RESERVE-PS_PADTYPE * ?
.dc.w PS_RESERVE-PS_PADTYPE * ?
.dc.w PS_JOGCON-PS_PADTYPE * ジョグコン
.dc.w PS_UNKNOWPAD-PS_PADTYPE * その他
PS_MOUSE:
move.l d2,JOY_PAD_TYPE(a0)
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み情報クリア
move.b (a3)+,d2 * サイズ取得
move.b (a3)+,d3 * 通信ステータス取得
bsr PS_DIGITAL_SET
subq.b #2,d2
beq PS_MOUSE_1
move.b (a3)+,JOY_LUD_DATA(a0) * 上下アナログ値セット
ori.b #$01,JOY_ANALOG_FLG+1(a0) * 上下アナログ値有効
subq.b #1,d2
beq PS_MOUSE_2
move.b (a3)+,JOY_LLR_DATA(a0) * 左右アナログ値セット
ori.b #$02,JOY_ANALOG_FLG+1(a0) * 左右アナログ値有効
subq.b #1,d2
bra PS_MOUSE_3
PS_MOUSE_1:
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
PS_MOUSE_2:
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
PS_MOUSE_3:
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
bsr PLUS_EMU_SET * 十字キーエミュレート設定
cmpi.b #$5a,d3
beq PS_MOUSE_E
cmpi.l #PS_SND_NORMAL_000,JOY_SND_BUF(a0)
bne PS_MOUSE_E
bsr SET_PS_MOTOR_SND * PSモーターコマンド送信パラメータ設定
PS_MOUSE_E:
bra IOCS3B_SET
PS_ANALOG1:
move.l d2,JOY_PAD_TYPE(a0)
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み情報クリア
move.b (a3)+,d2 * サイズ取得
move.b (a3)+,d3 * 通信ステータス取得
bsr PS_DIGITAL_SET
subq.b #2,d2
beq PS_ANALOG1_1
move.b (a3)+,JOY_LLR_DATA(a0) * ねじり
ori.b #$02,JOY_ANALOG_FLG+1(a0) * 左右アナログ値有効
subq.b #1,d2
beq PS_ANALOG1_2
move.b (a3)+,JOY_BTN1_DATA(a0) * ボタン1
ori.b #$10,JOY_ANALOG_FLG+1(a0) * ボタン1有効
subq.b #1,d2
beq PS_ANALOG1_3
move.b (a3)+,JOY_BTN2_DATA(a0) * ボタン2
ori.b #$20,JOY_ANALOG_FLG+1(a0) * ボタン2有効
subq.b #1,d2
beq PS_ANALOG1_4
move.b (a3)+,JOY_BTN3_DATA(a0) * ボタン3
ori.b #$40,JOY_ANALOG_FLG+1(a0) * ボタン3有効
subq.b #1,d2
bra PS_ANALOG1_5
PS_ANALOG1_1:
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
PS_ANALOG1_2:
clr.b JOY_BTN1_DATA(a0) * ボタン1
PS_ANALOG1_3:
clr.b JOY_BTN2_DATA(a0) * ボタン2
PS_ANALOG1_4:
clr.b JOY_BTN3_DATA(a0) * ボタン3
PS_ANALOG1_5:
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN4_DATA(a0) * ボタン4
bsr PLUS_EMU_SET * 十字キーエミュレート設定
cmpi.b #$5a,d3
beq PS_ANALOG1_E
cmpi.l #PS_SND_NORMAL_000,JOY_SND_BUF(a0)
bne PS_ANALOG1_E
bsr SET_PS_MOTOR_SND * PSモーターコマンド送信パラメータ設定
PS_ANALOG1_E:
bra IOCS3B_SET
PS_DIGITAL:
move.l d2,JOY_PAD_TYPE(a0)
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み情報クリア
move.b (a3)+,d2 * サイズ取得
move.b (a3)+,d3 * 通信ステータス取得
bsr PS_DIGITAL_SET
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
cmpi.b #$5a,d3
beq PS_DIGITAL_E
cmpi.l #PS_SND_NORMAL_000,JOY_SND_BUF(a0)
bne PS_DIGITAL_E
bsr SET_PS_MOTOR_SND * PSモーターコマンド送信パラメータ設定
PS_DIGITAL_E:
bra IOCS3B_SET
PS_ANALOG2:
move.l d2,JOY_PAD_TYPE(a0)
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み情報クリア
move.b (a3)+,d2 * サイズ取得
move.b (a3)+,d3 * 通信ステータス取得
bsr PS_DIGITAL_SET
subq.b #2,d2
beq PS_ANALOG2_1
move.b (a3)+,JOY_RLR_DATA(a0) * 右・左右アナログ値セット
ori.b #$08,JOY_ANALOG_FLG+1(a0) * 右・左右アナログ値有効
subq.b #1,d2
beq PS_ANALOG2_2
move.b (a3)+,JOY_RUD_DATA(a0) * 右・上下アナログ値セット
ori.b #$04,JOY_ANALOG_FLG+1(a0) * 右・上下アナログ値有効
subq.b #1,d2
beq PS_ANALOG2_3
move.b (a3)+,JOY_LLR_DATA(a0) * 左・左右アナログ値セット
ori.b #$02,JOY_ANALOG_FLG+1(a0) * 左・左右アナログ値有効
subq.b #1,d2
beq PS_ANALOG2_4
move.b (a3)+,JOY_LUD_DATA(a0) * 左・上下アナログ値セット
ori.b #$01,JOY_ANALOG_FLG+1(a0) * 左・上下アナログ値有効
subq.b #1,d2
bra PS_ANALOG2_5
PS_ANALOG2_1:
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
PS_ANALOG2_2:
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
PS_ANALOG2_3:
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
PS_ANALOG2_4:
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
PS_ANALOG2_5:
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
bsr PLUS_EMU_SET * 十字キーエミュレート設定
cmpi.b #$5a,d3
beq PS_ANALOG2_E
cmpi.l #PS_SND_NORMAL_000,JOY_SND_BUF(a0)
bne PS_ANALOG2_E
bsr SET_PS_MOTOR_SND * PSモーターコマンド送信パラメータ設定
PS_ANALOG2_E:
bra IOCS3B_SET
PS_JOGCON:
move.l d2,JOY_PAD_TYPE(a0)
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み情報クリア
move.b (a3)+,d2 * サイズ取得
move.b (a3)+,d3 * 通信ステータス取得
bsr PS_DIGITAL_SET
subq.b #2,d2
beq PS_JOGCON_1
move.b (a3)+,JOY_LLR_DATA(a0) * ジョグ回転値
ori.b #$02,JOY_ANALOG_FLG+1(a0) * 左右アナログ値有効
subq.b #1,d2
beq PS_JOGCON_2
move.b (a3)+,JOY_BTN1_DATA(a0) * 右に一回転すると+1、左に一回転すると-1
ori.b #$10,JOY_ANALOG_FLG+1(a0) * ボタン1有効
subq.b #1,d2
beq PS_JOGCON_3
move.b (a3)+,JOY_BTN2_DATA(a0) * 右に回転していると1、左に回転していると2、回転無しは0
ori.b #$20,JOY_ANALOG_FLG+1(a0) * ボタン2有効
subq.b #1,d2
beq PS_JOGCON_4
move.b (a3)+,JOY_BTN3_DATA(a0) * ?
ori.b #$40,JOY_ANALOG_FLG+1(a0) * ボタン3有効
subq.b #1,d2
bra PS_JOGCON_5
PS_JOGCON_1:
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
PS_JOGCON_2:
clr.b JOY_BTN1_DATA(a0) * ボタン1
PS_JOGCON_3:
clr.b JOY_BTN2_DATA(a0) * ボタン2
PS_JOGCON_4:
clr.b JOY_BTN3_DATA(a0) * ボタン3
PS_JOGCON_5:
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN4_DATA(a0) * ボタン4
bsr PLUS_EMU_SET * 十字キーエミュレート設定
cmpi.b #$5a,d3
beq PS_JOGCON_E
cmpi.l #PS_SND_NORMAL_000,JOY_SND_BUF(a0)
bne PS_JOGCON_E
bsr SET_PS_MOTOR_SND * PSモーターコマンド送信パラメータ設定
PS_JOGCON_E:
bra IOCS3B_SET
PS_UNKNOWPAD:
st.b JOY_PS_MOTOR_STS(a0) * モータータイプ = デュアルショック
bra IOCS3B_SET
PS_RESERVE:
move.l d2,JOY_PAD_TYPE(a0)
move.w #$ffff,JOY_D_DATA(a0) * デジタルデータ
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み無し
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
bra IOCS3B_SET
PS_DIGITAL_SET:
move.b (a3)+,d4
lsl.w #8,d4
move.b (a3)+,d4
moveq.l #$ff,d0
lea.l PSCNV_DATA(pc),a4
moveq.l #15,d5
PS_DIGITAL_SET_1:
btst.l d5,d4
bne PS_DIGITAL_SET_2
and.w (a4),d0
PS_DIGITAL_SET_2:
addq.w #2,a4
dbra d5,PS_DIGITAL_SET_1
move.w d0,JOY_D_DATA(a0) * デジタルデータ
bsr LENSHA_MODE
bsr BIT_CNV_MODE * ビット変換
rts
PSCNV_DATA:
.dc.w $fffb * 左変換データ
.dc.w $fffd * 下変換データ
.dc.w $fff7 * 右変換データ
.dc.w $fffe * 上変換データ
.dc.w $ff7f * スタート変換データ
.dc.w $dfff * 右アナログスティックボタン変換データ
.dc.w $bfff * 左アナログスティックボタン変換データ
.dc.w $7fff * セレクト変換データ
.dc.w $fbff * □変換データ
.dc.w $ffbf * ×変換データ
.dc.w $ffef * ○変換データ
.dc.w $fdff * △変換データ
.dc.w $feff * R1変換データ
.dc.w $f7ff * L1変換データ
.dc.w $ffdf * R2変換データ
.dc.w $efff * L2変換データ
*
* 1バイトコマンド転送 & データ取得(コントローラ専用)
*
* IN D4.B = コマンド
* A1.L = $e9a001
* A2.L = $e9a007
*
* OUT D0.L = 破壊
* D4.B = データ
* D5.w = 破壊
* D6.L = 破壊
PS_IF_PAD:
moveq.l #7,d6 * CLKカウンタ
not.b d4 * CMD反転
lsr.b #1,d4 * XフラグにCMD
move.w sr,d5 * SRレジスタ保持
ori.w #$0700,sr * 割り込み禁止
PS_IF_PAD_1:
moveq.l #7,d0
roxl.b #1,d0
move.b d0,(a2) * CMD書き込み
move.b #$d,(a2) * CLK = 0
moveq.l #5,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
move.b #$c,(a2) * CLK = 1
moveq.l #4,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
move.b (a1),d0 * DAT読み込み
lsr.b #1,d0 * XフラグにDAT
roxr.b #1,d4 * d4にDATをセットして、XフラグにCMD
dbra d6,PS_IF_PAD_1
move.b #$e,(a2) * CMD = 1
move.w d5,sr * SRレジスタ復帰
moveq.l #4,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
rts
JOY_WAIT:
add.w COM_DATA+COM_WAIT_HOSEI(pc),d0 * WAIT補正値加算
JOY_WAIT_1:
tst.b (a1) * WAIT
dbra d0,JOY_WAIT_1
rts
SET_PS_MOTOR_SND:
move.l #PS_SND_MOTOR1_000,JOY_SND_BUF(a0)
clr.b JOY_PS_MOTOR_STS(a0)
rts
MD_MTAP_ERROR1:
moveq.l #2,d0 * JOYSTICK PORT 1
bra ATARI68_1
MD_MTAP:
move.w COM_DATA+COM_JOY1_MAX(pc),d2
cmpi.w #4,d2
ble MD_MTAP_1
moveq.l #4,d2
MD_MTAP_1:
cmp.w d2,d1
beq MD_MTAP_ERROR1
bgt IOCS3B_ERROR * ジョイスティック番号が範囲外か?
move.l #PAD_TYPE_MD*65536+PAD_TYPE_MTAP,d6 * パッドタイプ = メガドライブ + マルチタップ
move.w d1,d0
lsl.w #8,d0
lea.l JOY_DATA(pc),a0
adda.w d0,a0 * 対象JOY番号のデータ領域
move.l a0,COM_DATA+COM_OUT_JOYBUF * 出力バッファ
cmpi.w #1,COM_DATA+COM_HANTEI_MODE
beq MD_MTAP_2 * キャッシュ無し指定か
cmpi.w #PAD_TYPE_MD,JOY_CACHE_STS(a0)
beq MD_MTAP_7 * メガドラでキャッシュされているデータがあるか
MD_MTAP_2:
move.b #8,(a2) * PC4 = 0
lea.l COM_DATA+COM_RCV_BUF(pc),a3 * 受信バッファ
moveq.l #$ff,d2 * 読み込みデータ無し
moveq.l #7-1,d6 * 初期データ読み込み回数
MD_MTAP_3:
bsr MD_GET_DATA * 1-3:DUMMY,4-7:PORT A-D
move.b d2,(a3)+ * データ格納
dbra d6,MD_MTAP_3
lea.l JOY_DATA(pc),a0
lea.l COM_DATA+COM_RCV_BUF+3(pc),a4 * コントローラタイプ格納領域
move.w d1,d3 * 接続可能コントローラ数-1
MD_MTAP_4:
lea.l MD_DATA_SIZE(pc),a3
moveq.l #0,d5
move.b (a4)+,d5 * コントローラタイプ取得
move.b 0(a3,d5.w),d6 * PORT DATA SIZE
bmi MD_MTAP_6
lea.l COM_DATA+COM_RCV_BUF+7(pc),a3 * 受信バッファ
MD_MTAP_5:
bsr MD_GET_DATA * GET DATA
move.b d2,(a3)+ * データ格納
dbra d6,MD_MTAP_5
MD_MTAP_6:
lea.l COM_DATA+COM_RCV_BUF+7(pc),a3 * 受信バッファ
move.l #PAD_TYPE_MD*65536+PAD_TYPE_MTAP,JOY_PAD_TYPE(a0)
* パッドタイプ = メガドライブ + マルチタップ
move.b d5,JOY_PAD_TYPE+3(a0)
move.w #PAD_TYPE_MD,JOY_CACHE_STS(a0) * キャッシュあり
clr.w JOY_PORT_NO(a0) * ポート番号設定(PORT1)
move.w d5,d0 * コントローラタイプ取得
add.w d0,d0 * 2倍
move.w MD_PADTYPE(pc,d0.w),d0
jsr MD_PADTYPE(pc,d0.w) * タイプ別処理に飛ぶ
lea.l DATA_SIZE(a0),a0 * 次のJOY番号のデータ領域
dbra d3,MD_MTAP_4
move.b #14,(a2) * PC7 = 0
move.b #9,(a2) * PC4 = 1
MD_MTAP_7:
movea.l COM_DATA+COM_OUT_JOYBUF(pc),a0
move.w #$ffff,JOY_CACHE_STS(a0) * キャッシュ無し
bra IOCS3B_SET
MD_PADTYPE:
.dc.w MD_3BUTTON-MD_PADTYPE * 3ボタン
.dc.w MD_6BUTTON-MD_PADTYPE * 6ボタン
.dc.w MD_MOUSE-MD_PADTYPE * マウス
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_RESERVE-MD_PADTYPE * ?
.dc.w MD_NOPAD-MD_PADTYPE * 未接続
MD_3BUTTON:
moveq.l #$ff,d0
move.b (a3)+,d0
move.b (a3),d6
lsl.b #4,d6
or.b d6,d0
move.w d0,JOY_D_DATA(a0) * デジタルデータ
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み無し
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
bsr LENSHA_MODE
bsr BIT_CNV_MODE
rts
MD_6BUTTON:
moveq.l #$ff,d0
move.b (a3)+,d5
move.b (a3)+,d6
move.b (a3),d0
ori.b #$f0,d0
lsl.w #8,d0
lsl.b #4,d6
or.b d6,d5
move.b d5,d0
btst.l #11,d0
bne MD_6BUTTON_1
andi.w #$7fff,d0
MD_6BUTTON_1:
move.w d0,JOY_D_DATA(a0) * デジタルデータ
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み無し
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
bsr LENSHA_MODE
bsr BIT_CNV_MODE
rts
MD_MOUSE:
MD_RESERVE:
MD_NOPAD:
move.w #$ffff,JOY_D_DATA(a0) * デジタルデータ
clr.b JOY_ANALOG_FLG+1(a0) * アナログ読み込み無し
move.b #$80,JOY_LUD_DATA(a0) * 左・上下
move.b #$80,JOY_LLR_DATA(a0) * 左・左右
move.b #$80,JOY_RUD_DATA(a0) * 右・上下
move.b #$80,JOY_RLR_DATA(a0) * 右・左右
clr.b JOY_BTN1_DATA(a0) * ボタン1
clr.b JOY_BTN2_DATA(a0) * ボタン2
clr.b JOY_BTN3_DATA(a0) * ボタン3
clr.b JOY_BTN4_DATA(a0) * ボタン4
rts
MD_GET_DATA:
tst.w d2
bpl MD_GET_DATA_3
move.b #14,(a2) * PC7 = 0
moveq.l #$7f,d0
moveq.l #$0f,d4
MD_GET_DATA_1:
btst.b #5,(a1) * PA5 == 1 ?
dbne d0,MD_GET_DATA_1
beq MD_MTAP_ERROR2 * 接続エラー
and.b (a1),d4 * GET_DATA
move.b #15,(a2) * PC7 = 1
moveq.l #$7f,d0
move.w #$ff0f,d2
MD_GET_DATA_2:
btst.b #5,(a1) * PA5 == 0 ?
dbeq d0,MD_GET_DATA_2
bne MD_MTAP_ERROR2 * 接続エラー
and.b (a1),d2 * GET_DATA
swap.w d2
move.w d4,d2
rts
MD_GET_DATA_3:
swap.w d2
rts
MD_MTAP_ERROR2:
addq.w #4,a7 * rts分補正
move.b #14,(a2) * PC7 = 0
move.b #9,(a2) * PC4 = 1
bra ATARI68 * アタリパッドの読み込み
MD_DATA_SIZE:
.dc.b 2-1 * 3ボタン
.dc.b 3-1 * 6ボタン
.dc.b 6-1 * セガマウス
.dc.b 0-1 * 無し
.dc.b 0-1 * 無し
.dc.b 0-1 * 無し
.dc.b 0-1 * 無し
.dc.b 0-1 * 無し
.dc.b 0-1 * 無し
.dc.b 0-1 * 無し
.dc.b 0-1 * 無し
.dc.b 0-1 * 無し
.dc.b 0-1 * 無し
.dc.b 0-1 * 無し
.dc.b 0-1 * 無し
.dc.b 0-1 * 未接続
COM_DATA:
COM_DATA_INIT * 共通データ
JOY_DATA:
JOY_DATA_INIT
JOY_DATA_INIT
JOY_DATA_INIT
JOY_DATA_INIT
JOY_DATA_INIT
JOY_DATA_INIT
JOY_DATA_INIT
PS_SND_NORMAL_000:
.dc.l PS_SND_NORMAL_DATA000
.dc.w 30
.dc.l PS_SND_NORMAL_000
PS_SND_NORMAL_DATA000:
.dc.b $42,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_000:
.dc.l PS_SND_MOTOR1_DATA000
.dc.w 30
.dc.l PS_SND_MOTOR1_001
PS_SND_MOTOR1_001:
.dc.l PS_SND_MOTOR1_DATA001
.dc.w 30
.dc.l PS_SND_MOTOR1_002
PS_SND_MOTOR1_002:
.dc.l PS_SND_MOTOR1_DATA002
.dc.w 30
.dc.l PS_SND_MOTOR1_003
PS_SND_MOTOR1_003:
.dc.l PS_SND_MOTOR1_DATA003
.dc.w 30
.dc.l PS_SND_MOTOR1_004
PS_SND_MOTOR1_004:
.dc.l PS_SND_MOTOR1_DATA004
.dc.w 30
.dc.l PS_SND_MOTOR1_005
PS_SND_MOTOR1_005:
.dc.l PS_SND_MOTOR1_DATA005
.dc.w 30
.dc.l PS_SND_MOTOR1_006
PS_SND_MOTOR1_006:
.dc.l PS_SND_MOTOR1_DATA006
.dc.w 30
.dc.l PS_SND_MOTOR1_007
PS_SND_MOTOR1_007:
.dc.l PS_SND_MOTOR1_DATA007
.dc.w 30
.dc.l PS_SND_MOTOR1_008
PS_SND_MOTOR1_008:
.dc.l PS_SND_MOTOR1_DATA008
.dc.w 30
.dc.l PS_SND_MOTOR1_009
PS_SND_MOTOR1_009:
.dc.l PS_SND_MOTOR1_DATA009
.dc.w 30
.dc.l PS_SND_MOTOR1_010
PS_SND_MOTOR1_010:
.dc.l PS_SND_MOTOR1_DATA010
.dc.w 30
.dc.l PS_SND_MOTOR1_011
PS_SND_MOTOR1_011:
.dc.l PS_SND_MOTOR1_DATA011
.dc.w 30
.dc.l PS_SND_MOTOR1_012
PS_SND_MOTOR1_012:
.dc.l PS_SND_MOTOR1_DATA012
.dc.w 30
.dc.l PS_SND_MOTOR1_013
PS_SND_MOTOR1_013:
.dc.l PS_SND_MOTOR1_DATA013
.dc.w 30
.dc.l PS_SND_MOTOR1_014
PS_SND_MOTOR1_014:
.dc.l PS_SND_MOTOR1_DATA014
.dc.w 30
.dc.l PS_SND_MOTOR1_015
PS_SND_MOTOR1_015:
.dc.l PS_SND_MOTOR1_DATA015
.dc.w 30
.dc.l PS_SND_MOTOR1_016
PS_SND_MOTOR1_016:
.dc.l PS_SND_MOTOR1_DATA016
.dc.w 30
.dc.l PS_SND_NORMAL_000
PS_SND_MOTOR1_DATA000:
.dc.b $42,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA001:
.dc.b $43,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA002:
.dc.b $45,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA003:
.dc.b $4c,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA004:
.dc.b $47,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA005:
.dc.b $4c,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA006:
.dc.b $4c,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA007:
.dc.b $45,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA008:
.dc.b $45,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA009:
.dc.b $47,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA010:
.dc.b $43,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA011:
.dc.b $42,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA012:
.dc.b $42,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA013:
.dc.b $43,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA014:
.dc.b $4d,$00,$00,$01,$ff,$ff,$ff,$ff,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA015:
.dc.b $43,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PS_SND_MOTOR1_DATA016:
.dc.b $42,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.even
MODECNV_RTN:
cmpi.w #$23,d2
bcc MODECNV_RTN_1 * モード指定が範囲外か?
move.w d2,d0
add.w d0,d0 * 2倍
move.w MODECNV_TBL(pc,d0.w),d0
jmp MODECNV_TBL(pc,d0.w) * 各モード指定に飛ぶ
MODECNV_RTN_1:
moveq.l #$ff,d0 * 設定値が範囲外
rts
MODECNV_TBL:
.dc.w DRV_INITEND-MODECNV_TBL * ドライバ初期化/終了処理
.dc.w JOYDRV_KEEP_STS-MODECNV_TBL * 常駐状態取得
.dc.w GET_BUF_ADR-MODECNV_TBL * 内部データアドレス取得
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w ANALOG_GET-MODECNV_TBL * アナログパッド読み込み
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MULTI_STS-MODECNV_TBL * マルチタップ判定モード設定/取得
.dc.w CNVMODE_STS-MODECNV_TBL * ビット変換モード設定/取得
.dc.w CNVDATA_STS-MODECNV_TBL * ビット変換データ設定/取得
.dc.w OUTPUT_STS-MODECNV_TBL * 出力モード設定/取得
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MTAP_MAX_SET-MODECNV_TBL * マルチタップ・パッド接続数設定
.dc.w PLUS_EMULATION-MODECNV_TBL * アナログスティック・エミュレート設定
.dc.w PEM_PNT_SET-MODECNV_TBL * 十字キーエミュレートしきい値設定
.dc.w STASEL_MODE-MODECNV_TBL * START,SELECTボタン動作モード設定/取得
.dc.w LENONOFF_MODE-MODECNV_TBL * 連射モード設定/取得
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w MODECNV_RTN_1-MODECNV_TBL * 予備
.dc.w PS_MEMBREAD-MODECNV_TBL * プレイステーションメモリカード読み込み
.dc.w PS_MEMBWRITE-MODECNV_TBL * プレイステーションメモリカード書き込み
.dc.w PS_MOTOR-MODECNV_TBL * プレイステーション振動パッド制御
* $00~$0F システム関連
* $10~$1F 設定関連
* $20~$2F 特殊コール(プレイステーション関連)
* $30~$3F 特殊コール(サターン関連)
DRV_INITEND:
moveq.l #0,d0
movea.l #$e9a007,a0
move.b #$c,(a0)
move.b #$e,(a0)
tst.w d3
bne DRV_INITEND_10
move.b #$9,(a0)
move.b #$b,(a0)
cmpi.b #3,$cbc.w
bls DRV_INITEND_1
moveq.l #2,d0
DRV_INITEND_1:
move.w d0,COM_DATA+COM_WAIT_HOSEI
moveq.l #0,d0
rts
DRV_INITEND_10:
move.b #$8,(a0)
move.b #$a,(a0)
rts
JOYDRV_KEEP_STS:
lea.l KEEP_CHK_NAME(pc),a0
move.l a0,d0 * JOYDRVは常駐している
rts
GET_BUF_ADR:
tst.w d3
bmi GET_BUF_ADR_2
cmpi.w #JOY_MAX,d3
bcc GET_BUF_ADR_1 * ジョイスティック番号が範囲外か?
move.w d3,d0
lsl.w #8,d0
lea.l JOY_DATA(pc),a1
adda.w d0,a1
moveq.l #0,d0
rts
GET_BUF_ADR_1:
moveq.l #$fe,d0 * ジョイスティック番号が範囲外
rts
GET_BUF_ADR_2:
lea.l COM_DATA(pc),a1
moveq.l #0,d0
rts
MULTI_STS:
tst.w d3
bmi MULTI_STS_1 * 状態取得か?
cmpi.w #3,d3
bcc MULTI_STS_2 * 設定値が範囲外か?
lea.l COM_DATA+COM_HANTEI_MODE(pc),a0
move.w d3,(a0) * マルチタップ判定モード設定
moveq.l #0,d0 * 正常終了
rts
MULTI_STS_1:
move.w COM_DATA+COM_HANTEI_MODE(pc),d0 * マルチタップ判定モード取得
rts
MULTI_STS_2:
moveq.l #$ff,d0 * 設定値が範囲外
rts
CNVMODE_STS:
cmpi.w #JOY_MAX,d4
bcc CNVMODE_STS_1 * ジョイスティック番号が範囲外か?
move.w d4,d0
lsl.w #8,d0
lea.l JOY_DATA+JOY_CNV_MODE(pc),a0
adda.w d0,a0
tst.w d3
bmi CNVMODE_STS_2 * 状態取得か?
cmpi.w #2,d3
bcc CNVMODE_STS_3 * 設定値が範囲外か?
move.w d3,(a0) * ビット変換モード設定
moveq.l #0,d0 * 正常終了
rts
CNVMODE_STS_1:
moveq.l #$fe,d0 * ジョイスティック番号が範囲外
rts
CNVMODE_STS_2:
move.w (a0),d0 * ビット変換モード取得
rts
CNVMODE_STS_3:
moveq.l #$ff,d0 * 設定値が範囲外
rts
CNVDATA_STS:
cmpi.w #JOY_MAX,d4
bcc CNVDATA_STS_2 * ジョイスティック番号が範囲外か?
move.l a1,-(a7) * レジスタ保存
move.w d4,d0
lsl.w #8,d0
lea.l JOY_DATA+JOY_CNV_DATA(pc),a0
adda.w d0,a0
moveq.l #32-1,d0
tst.w d3
bpl CNVDATA_STS_1 * 状態取得か?
exg.l a1,a0
CNVDATA_STS_1:
move.b (a1)+,(a0)+
dbra d0,CNVDATA_STS_1
movea.l (a7)+,a1 * レジスタ復帰
moveq.l #0,d0 * 正常終了
rts
CNVDATA_STS_2:
moveq.l #$fe,d0 * ジョイスティック番号が範囲外
rts
OUTPUT_STS:
tst.w d3
bmi OUTPUT_STS_1 * 状態取得か?
cmpi.w #2,d3
bcc OUTPUT_STS_2 * 設定値が範囲外か?
lea.l COM_DATA+COM_IOCS3B_OUT(pc),a0
move.w d3,(a0) * 出力モード設定
moveq.l #0,d0 * 正常終了
rts
OUTPUT_STS_1:
move.w COM_DATA+COM_IOCS3B_OUT(pc),d0 * 出力モード取得
rts
OUTPUT_STS_2:
moveq.l #$ff,d0 * 設定値が範囲外
rts
MTAP_MAX_SET:
tst.w d3
bmi MTAP_MAX_SET_2 * 状態取得か?
move.w d3,d0
cmpi.w #JOY_MAX-1,d0 * タップ数がドライバの管理する範囲外か?
bls MTAP_MAX_SET_1
moveq.l #JOY_MAX-1,d0
MTAP_MAX_SET_1:
lea.l COM_DATA+COM_JOY1_MAX(pc),a0
move.w d0,(a0) * パッド数設定
moveq.l #0,d0 * 正常終了
rts
MTAP_MAX_SET_2:
move.w COM_DATA+COM_JOY1_MAX(pc),d0 * パッド数取得
rts
PLUS_EMULATION:
cmpi.w #JOY_MAX,d4
bcc PLUS_EMULATION_2 * ジョイスティック番号が範囲外か?
move.w d4,d0
lsl.w #8,d0
lea.l JOY_DATA+JOY_PLUS_EMU(pc),a0
adda.w d0,a0
tst.w d3
bmi PLUS_EMULATION_1 * 状態取得か?
move.w d3,(a0) * エミュレート設定
moveq.l #0,d0 * 正常終了
rts
PLUS_EMULATION_1:
move.w (a0),d0 * エミュレート設定取得
rts
PLUS_EMULATION_2:
moveq.l #$fe,d0 * ジョイスティック番号が範囲外
rts
STASEL_MODE:
cmpi.w #JOY_MAX,d4
bcc STASEL_MODE_2 * ジョイスティック番号が範囲外か?
move.w d4,d0
lsl.w #8,d0
lea.l JOY_DATA+JOY_STASEL_MODE(pc),a0
adda.w d0,a0
tst.w d3
bmi STASEL_MODE_1 * 状態取得か?
cmpi.w #2,d3
bcc STASEL_MODE_3 * 設定値が範囲外か?
move.w d3,(a0) * START,SELECTボタン動作モード設定
moveq.l #0,d0 * 正常終了
rts
STASEL_MODE_1:
move.w (a0),d0 * START,SELECTボタン動作モード取得
rts
STASEL_MODE_2:
moveq.l #$fe,d0 * ジョイスティック番号が範囲外
rts
STASEL_MODE_3:
moveq.l #$ff,d0 * 設定値が範囲外
rts
LENONOFF_MODE:
cmpi.w #JOY_MAX,d4
bcc LENONOFF_MODE_2 * ジョイスティック番号が範囲外か?
cmpi.w #16,d5
bcc LENONOFF_MODE_3 * ビット番号が範囲外か?
move.w d4,d0
lsl.w #8,d0
add.w d5,d0
add.w d5,d0
lea.l JOY_DATA(pc),a0
adda.w d0,a0
tst.l d3
bmi LENONOFF_MODE_1 * 状態取得か?
move.w d3,JOY_ONOFF_SU(a0) * ON/OFF数設定
move.w d3,JOY_ONOFF_CNT(a0) * ON/OFF数設定
moveq.l #0,d0 * 正常終了
rts
LENONOFF_MODE_1:
move.w JOY_ONOFF_SU(a0),d0 * ON/OFF数取得
rts
LENONOFF_MODE_2:
moveq.l #$fe,d0 * ジョイスティック番号が範囲外
rts
LENONOFF_MODE_3:
moveq.l #$f8,d0 * ビット番号が範囲外
rts
PEM_PNT_SET:
cmpi.w #JOY_MAX,d4
bcc PEM_PNT_SET_3 * ジョイスティック番号が範囲外か?
move.w d4,d0
lsl.w #8,d0
lea.l JOY_DATA+JOY_PLUS_EMU+2(pc),a0
adda.w d0,a0
tst.w d3
bmi PEM_PNT_SET_1 * 状態取得か?
cmpi.w #$7f,d3
bhi PEM_PNT_SET_2 * 設定値が範囲外か?
move.w d3,(a0) * エミュレートしきい値設定
moveq.l #0,d0 * 正常終了
rts
PEM_PNT_SET_1:
move.w (a0),d0 * エミュレートしきい値取得
rts
PEM_PNT_SET_2:
moveq.l #$ff,d0 * 設定値が範囲外
rts
PEM_PNT_SET_3:
moveq.l #$fe,d0 * ジョイスティック番号が範囲外
rts
PS_MEMBREAD:
movem.l d1-d7/a1-a2,-(a7) * レジスタ保存
movea.l a1,a0
lea.l $e9a001,a1 * ジョイスティックI/Oアドレス
lea.l 6(a1),a2 * ジョイスティックI/Oアドレス
bsr CHECK_PSCABLE
tst.b d0
bmi PS_MEMBREAD_10
PS_MEMBREAD_1:
bsr PS_MEMFREAD * 1フレーム読み込み
tst.l d0
bmi PS_MEMBREAD_2 * $fb .. メモリカード未接続 $fa .. 読み込みエラー
move.w #100,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
addq.w #1,d4
dbra d5,PS_MEMBREAD_1
moveq.l #0,d0
PS_MEMBREAD_2:
movem.l (a7)+,d1-d7/a1-a2 * レジスタ復帰
rts
PS_MEMBREAD_10:
moveq.l #$fc,d0 * PSケーブルが接続されていない
bra PS_MEMBREAD_2
PS_MEMFREAD:
move.b #8,(a2) * PC4 = 0
moveq.l #$2f,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
move.w d3,d1
addi.w #$0081,d1 * 読み込みメモリカード位置指定
bsr PS_IF_MMR * 通信
moveq.l #$52,d1 * CMD 52
bsr PS_IF_MMR * 通信
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMR * 通信
cmpi.b #$5a,d0
bne PS_MEMFREAD_10
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMR * 通信
move.w d4,d1
lsr.w #8,d1 * アドレス上位
bsr PS_IF_MMR * 通信
move.b d4,d1 * アドレス下位
bsr PS_IF_MMR * 通信
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMR * 通信
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMR * 通信
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMR * 通信
move.b d0,d7
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMR * 通信
eor.b d0,d7
move.l d5,-(a7) * レジスタ保存
moveq.l #$7f,d5 * 1フレームバイト数-1
PS_MEMFREAD_1:
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMR * 通信
move.b d0,(a0)+
eor.b d0,d7
dbra d5,PS_MEMFREAD_1
move.l (a7)+,d5 * レジスタ復帰
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMR * 通信
eor.b d0,d7
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMR * 通信
tst.b d7
bne PS_MEMFREAD_11
moveq.l #0,d0 * 正常終了
PS_MEMFREAD_2:
move.b #9,(a2) * PC4 = 1
rts
PS_MEMFREAD_10:
moveq.l #$fb,d0 * メモリカード未接続
bra PS_MEMFREAD_2
PS_MEMFREAD_11:
moveq.l #$fa,d0 * 読み込みエラー
bra PS_MEMFREAD_2
*
* 1バイトコマンド転送 & データ取得
*
* IN D1.B = コマンド
* D6.W = WAIT TIME
* A0.L = $e9a001
* A2.L = $e9a007
*
* OUT D0.B = データ
* D1.L = 破壊
* D2.L = 破壊
PS_IF_MMR:
moveq.l #7,d2 * CLKカウンタ
not.b d1 * CMD反転
lsr.b #1,d1 * XフラグにCMD
move.w sr,-(a7)
ori.w #$0700,sr * 割り込み禁止
PS_IF_MMR_1:
moveq.l #7,d0
roxl.b #1,d0
move.b #$d,(a2) * CLK = 0
move.b d0,(a2) * CMD書き込み
moveq.l #$2f,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
move.b #$c,(a2) * CLK = 1
moveq.l #$2f,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
move.b (a1),d0 * DAT読み込み
lsr.b #1,d0 * XフラグにDAT
roxr.b #1,d1 * d1にDATをセットして、XフラグにCMD
dbra d2,PS_IF_MMR_1
move.b #$e,(a2) * CMD = 1
move.w (a7)+,sr
moveq.l #$2f,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
move.b d1,d0
rts
CHECK_PSCABLE:
move.b #9,(a2) * ON
tst.b (a1)
move.b (a1),d0
andi.b #$0f,d0
cmpi.b #2,d0
sne d0
rts
PS_MEMBWRITE:
movem.l d1-d7/a1-a2,-(a7) * レジスタ保存
movea.l a1,a0
lea.l $e9a001,a1 * ジョイスティックI/Oアドレス
lea.l 6(a1),a2 * ジョイスティックI/Oアドレス
bsr CHECK_PSCABLE
tst.b d0
bmi PS_MEMBWRITE_10
PS_MEMBWRITE_1:
bsr PS_MEMFWRITE * 1フレーム書き込み
tst.l d0
bmi PS_MEMBWRITE_2 * $fb .. メモリカード未接続 $f9 .. 書き込みエラー
move.w #8900,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
addq.w #1,d4
dbra d5,PS_MEMBWRITE_1
moveq.l #0,d0
PS_MEMBWRITE_2:
movem.l (a7)+,d1-d7/a1-a2 * レジスタ復帰
rts
PS_MEMBWRITE_10:
moveq.l #$fc,d0 * PSケーブルが接続されていない
bra PS_MEMBWRITE_2
PS_MEMFWRITE:
move.b #8,(a2) * PC4 = 0
moveq.l #$3f,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
move.w d3,d1
addi.w #$0081,d1 * 書き込みメモリカード位置指定
bsr PS_IF_MMW * 通信
moveq.l #$57,d1 * CMD 57
bsr PS_IF_MMW * 通信
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMW * 通信
cmpi.b #$5a,d0
bne PS_MEMFWRITE_10
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMW * 通信
move.w d4,d1
lsr.w #8,d1 * アドレス上位
move.b d1,d7
bsr PS_IF_MMW * 通信
move.b d4,d1 * アドレス下位
eor.b d1,d7
bsr PS_IF_MMW * 通信
move.l d5,-(a7) * レジスタ保存
moveq.l #$7f,d5 * 1フレームバイト数-1
PS_MEMFWRITE_1:
move.b (a0)+,d1 * 書き込みデータ
eor.b d1,d7
bsr PS_IF_MMW * 通信
dbra d5,PS_MEMFWRITE_1
move.l (a7)+,d5 * レジスタ復帰
move.b d7,d1 * XORフラグ
bsr PS_IF_MMW * 通信
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMW * 通信
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMW * 通信
moveq.l #$00,d1 * CMD 00
bsr PS_IF_MMW * 通信
cmpi.b #$47,d0
bne PS_MEMFWRITE_11
moveq.l #0,d0 * 正常終了
PS_MEMFWRITE_2:
move.b #9,(a2) * PC4 = 1
rts
PS_MEMFWRITE_10:
moveq.l #$fb,d0 * メモリカード未接続
bra PS_MEMFWRITE_2
PS_MEMFWRITE_11:
moveq.l #$f9,d0 * 書き込みエラー
bra PS_MEMFWRITE_2
*
* 1バイトコマンド転送 & データ取得
*
* IN D1.B = コマンド
* D6.W = WAIT TIME
* A0.L = $e9a001
* A2.L = $e9a007
*
* OUT D0.B = データ
* D1.L = 破壊
* D2.L = 破壊
PS_IF_MMW:
moveq.l #7,d2 * CLKカウンタ
not.b d1 * CMD反転
lsr.b #1,d1 * XフラグにCMD
move.w sr,-(a7)
ori.w #$0700,sr * 割り込み禁止
PS_IF_MMW_1:
moveq.l #7,d0
roxl.b #1,d0
move.b d0,(a2) * CMD書き込み
move.b #$d,(a2) * CLK = 0
moveq.l #$3f,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
move.b #$c,(a2) * CLK = 1
move.b (a1),d0 * DAT読み込み
lsr.b #1,d0 * XフラグにDAT
roxr.b #1,d1 * d1にDATをセットして、XフラグにCMD
moveq.l #$3f,d0 * WAIT TIME
bsr JOY_WAIT * WAIT
dbra d2,PS_IF_MMW_1
move.b #$0e,(a2) * CMD(1)書き込み
move.w (a7)+,sr
move.b d1,d0
rts
PS_MOTOR:
cmpi.w #JOY_MAX,d3
bcc PS_MOTOR_10 * ジョイスティック番号が範囲外か?
move.w d3,d0
lsl.w #8,d0
lea.l JOY_DATA(pc),a0
adda.w d0,a0
btst.l #0,d4
sne.b JOY_MOTOR_STS(a0)
move.b d5,d0
btst.l #1,d4
bne PS_MOTOR_1
moveq.l #0,d0
PS_MOTOR_1:
move.b d0,JOY_MOTOR_STS+1(a0)
moveq.l #0,d0 * 正常終了
rts
PS_MOTOR_10:
moveq.l #$fe,d0 * ジョイスティック番号が範囲外
rts
ANALOG_GET:
cmpi.w #JOY_MAX,d3
bcc ANALOG_GET_2 * ジョイスティック番号が範囲外か?
movem.l d1/a1,-(a7) * レジスタ保存
move.w d3,d1
bsr IOCS3B * ジョイスティック読み込み
lsl.w #8,d1
lea.l JOY_DATA(pc),a0
adda.w d1,a0
move.l JOY_PAD_TYPE(a0),d0
move.b JOY_D_DATA(a0),(a1)+
move.b JOY_D_DATA+1(a0),(a1)+
move.b JOY_ANALOG_FLG+1(a0),(a1)+
move.b JOY_LUD_DATA(a0),(a1)+
move.b JOY_LLR_DATA(a0),(a1)+
move.b JOY_RUD_DATA(a0),(a1)+
move.b JOY_RLR_DATA(a0),(a1)+
move.b JOY_BTN1_DATA(a0),(a1)+
move.b JOY_BTN2_DATA(a0),(a1)+
move.b JOY_BTN3_DATA(a0),(a1)+
move.b JOY_BTN4_DATA(a0),(a1)
movem.l (a7)+,d1/a1 * レジスタ復帰
ANALOG_GET_1:
rts
ANALOG_GET_2:
moveq.l #$fe,d0 * ジョイスティック番号が範囲外
bra ANALOG_GET_1
IOCSF2:
cmpi.w #$3,d1
bcc IOCSF2_1 * モード指定が範囲外か?
move.w d1,d0
add.w d0,d0 * 2倍
move.w IOCSF2_TBL(pc,d0.w),d0
jmp IOCSF2_TBL(pc,d0.w) * 各モード指定に飛ぶ
IOCSF2_1:
moveq.l #$ff,d0 * 設定値が範囲外
rts
IOCSF2_TBL:
.dc.w F2_ANAGET-IOCSF2_TBL * アナログジョイスティック読み込み
.dc.w F2_JOYMODE-IOCSF2_TBL * ジョイスティックモード
.dc.w F2_SPEED-IOCSF2_TBL * 通信速度設定
F2_ANAGET:
movem.l d1/a1,-(a7) * レジスタ保存
moveq.l #0,d1 * ジョイスティック番号0
bsr IOCS3B * ジョイスティック読み込み
lea.l JOY_DATA(pc),a0 * バッファアドレス
move.b JOY_LUD_DATA(a0),d1 * 上下値読み込み
move.w d1,(a1)+ * 上下値セット
move.b JOY_LLR_DATA(a0),d1 * 左右値読み込み
move.w d1,(a1)+ * 左右値セット
move.b JOY_RUD_DATA(a0),d1 * 上下値読み込み
btst.b #2,JOY_ANALOG_FLG+1(a0) * 上下値が有効か?
bne F2_ANAGET_1
btst.b #4,JOY_ANALOG_FLG+1(a0) * ボタン1が有効か?
beq F2_ANAGET_1
move.b JOY_BTN1_DATA(a0),d1 * ボタン1値読み込み
F2_ANAGET_1:
move.w d1,(a1)+ * スロットル値セット
move.b JOY_RLR_DATA(a0),d1 * 左右値読み込み
btst.b #3,JOY_ANALOG_FLG+1(a0) * 左右値が有効か?
bne F2_ANAGET_2
btst.b #5,JOY_ANALOG_FLG+1(a0) * ボタン2が有効か?
beq F2_ANAGET_2
move.b JOY_BTN2_DATA(a0),d1 * ボタン2値読み込み
F2_ANAGET_2:
move.w d1,(a1)+ * オプション値セット
move.w JOY_D_DATA(a0),(a1) * デジタルデータ
moveq.l #0,d0 * 正常終了
movem.l (a7)+,d1/a1 * レジスタ復帰
rts
F2_JOYMODE:
move.l d1,-(a7) * レジスタ保存
moveq.l #0,d1 * ジョイスティック番号0
bsr IOCS3B * ジョイスティック読み込み
moveq.l #0,d0
lea.l JOY_DATA(pc),a0 * バッファアドレス
tst.b JOY_ANALOG_FLG+1(a0)
beq F2_JOYMODE_1
moveq.l #1,d0 * アナログモード
F2_JOYMODE_1:
move.l (a7)+,d1 * レジスタ復帰
rts
F2_SPEED:
moveq.l #0,d0 * 最高速度
rts
IOCS3B_VEC:
.dc.l 0 * IOCS$3Bアドレス
IOCSF2_VEC:
.dc.l 0 * IOCS$F2アドレス
STRTG_ADR:
.dc.l 0 * ストラテジアドレス
STRTG_RTN:
move.l a5,STRTG_ADR * ストラテジルーチン
rts
DEV_RTN:
movem.l d0-d6/a1-a5,-(a7) * ドライバルーチン
movea.l STRTG_ADR(pc),a5 * ストラテジアドレス取得
move.w #$5003,d0 * エラーリターン
tst.b $0002(a5) * 処理番号チェック
bne DEV_RTN1 * 初期化以外か?
bsr DEV_INIT * デバイスドライバ初期化
DEV_RTN1:
move.b d0,$0003(a5)
lsr.w #8,d0
move.b d0,$0004(a5) * エラーコードセット
movem.l (a7)+,d0-d6/a1-a5 * レジスタ復帰
rts
DEV_INIT: * ドライバ初期化
pea TITLE(pc)
.dc.w $ff09 * タイトル表示
addq.w #4,a7 * スタック補正
bsr KEEP_CHK1
tst.l d0
beq DEV_INIT_1
pea MSG_DATA1(pc)
DEV_INIT_0:
.dc.w $ff09
addq.w #4,a7
move.w #1,d0 * エラーコード異常終了セット
rts
DEV_INIT_1:
bsr PARM_RTN1
tst.l d0
bmi DEV_INIT_3
move.b SW_R(pc),d0
bne DEV_INIT_3
pea TITLE2(pc)
.dc.w $ff09
pea IOCS3B(pc) * 処理アドレスセット
move.w #$013b,-(a7) * ベクタ番号(IOCS$3B)セット
.dc.w $ff25 * ベクタセット
pea IOCSF2(pc) * 処理アドレスセット
move.w #$01f2,-(a7) * ベクタ番号(IOCS$F2)セット
.dc.w $ff25 * ベクタセット
lea.l 16(a7),a7
moveq.l #$ff,d1
moveq.l #0,d2
moveq.l #0,d3
moveq.l #$3b,d0
trap #15
bsr MODE_DSP
move.l #DEV_INIT,$000e(a5) * デバイスドライバ最終アドレスセット
clr.w d0 * エラーコード正常終了セット
rts
DEV_INIT_3:
pea MSG_DATA10(pc)
bra DEV_INIT_0
PARM_RTN1:
movea.l 18(a5),a1
PARM_RTN1_1:
tst.b (a1)+
bne PARM_RTN1_1
PARM_RTN1_2:
tst.b (a1)
beq PARM_RTN1_4
PARM_RTN1_3:
move.b (a1)+,d0
beq PARM_RTN1_2
bsr PARM_SUB
tst.l d0
beq PARM_RTN1_3
rts
PARM_RTN1_4:
moveq.l #0,d0
rts
MAIN:
pea TITLE(pc)
.dc.w $ff09 * タイトル表示
addq.w #4,a7
movea.l a2,a1
bsr PARM_RTN2
tst.l d0
bmi MAIN_5
bsr KEEP_CHK2
tst.l d0
beq MAIN_1
move.b SW_R(pc),d0
bne MAIN_4
pea MSG_DATA2(pc)
MAIN_0:
bsr MODE_CHG
move.b SW_D(pc),d0
bne MAIN_01
bsr MODE_DSP
MAIN_01:
.dc.w $ff09
addq.w #4,a7
.dc.w $ff00
MAIN_1:
bsr KEEP_CHK1
tst.l d0
beq MAIN_2
pea MSG_DATA1(pc)
bra MAIN_0
MAIN_2:
move.b SW_R(pc),d0
beq MAIN_3
pea MSG_DATA3(pc)
bra MAIN_01
MAIN_3:
pea IOCS3B(pc) * 処理アドレスセット
move.w #$013b,-(a7) * ベクタ番号(IOCS$3B)セット
.dc.w $ff25 * ベクタセット
move.l d0,IOCS3B_VEC
pea IOCSF2(pc) * 処理アドレスセット
move.w #$01f2,-(a7) * ベクタ番号(IOCS$F2)セット
.dc.w $ff25 * ベクタセット
move.l d0,IOCSF2_VEC
lea.l 12(a7),a7
moveq.l #$ff,d1
moveq.l #0,d2
moveq.l #0,d3
moveq.l #$3b,d0
trap #15
move.b SW_D(pc),d0
bne MAIN_31
pea TITLE2(pc)
.dc.w $ff09
addq.w #4,a7
bsr MODE_DSP
MAIN_31:
pea MSG_DATA4(pc)
.dc.w $ff09
addq.w #2,a7
clr.w (a7)
move.l #DEV_INIT-DEVHEAD,-(a7)
.dc.w $ff31
MAIN_4:
bsr KEEP_CHK3
tst.l d0
bne MAIN_41
pea MSG_DATA6(pc)
bra MAIN_01
MAIN_41:
moveq.l #$ff,d1
moveq.l #0,d2
moveq.l #1,d3
moveq.l #$3b,d0
trap #15
lea.l IOCS3B_VEC-DEVHEAD+256(a0),a1
move.l (a1),-(a7)
move.w #$013b,-(a7) * ベクタ番号(IOCS$3B)セット
.dc.w $ff25 * ベクタセット
lea.l IOCSF2_VEC-DEVHEAD+256(a0),a1
move.l (a1),2(a7)
move.w #$01f2,(a7) * ベクタ番号(IOCS$F2)セット
.dc.w $ff25 * ベクタセット
pea $10(a0)
.dc.w $ff49
pea MSG_DATA5(pc)
.dc.w $ff09
lea.l 14(a7),a7
.dc.w $ff00
MAIN_5:
pea MSG_DATA10(pc)
.dc.w $ff09
pea TITLE3(pc)
.dc.w $ff09
addq.w #8,a7
.dc.w $ff00
MODE_CHG:
moveq.l #$ff,d1
move.b SW_M(pc),d0
beq MODE_CHG2
moveq.l #$10,d2
move.w COM_DATA+COM_HANTEI_MODE(pc),d3
moveq.l #$3b,d0
trap #15
MODE_CHG2:
moveq.l #JOY_MAX-1,d4
move.w d4,d0
lsl.w #8,d0
lea.l JOY_DATA(pc),a2
adda.w d0,a2
lea.l SW_B+JOY_MAX(pc),a3
MODE_CHG2_1:
tst.b -(a3)
beq MODE_CHG2_3
move.w JOY_CNV_MODE(a2),d3
beq MODE_CHG2_2
lea.l JOY_CNV_DATA(a2),a1
moveq.l #$12,d2
moveq.l #$3b,d0
trap #15
MODE_CHG2_2:
moveq.l #$11,d2
moveq.l #$3b,d0
trap #15
MODE_CHG2_3:
lea.l -DATA_SIZE(a2),a2
dbra d4,MODE_CHG2_1
MODE_CHG3:
move.b SW_I(pc),d0
beq MODE_CHG4
moveq.l #$13,d2
move.w COM_DATA+COM_IOCS3B_OUT(pc),d3
moveq.l #$3b,d0
trap #15
MODE_CHG4:
move.b SW_T(pc),d0
beq MODE_CHG5
moveq.l #$15,d2
move.w COM_DATA+COM_JOY1_MAX(pc),d3
moveq.l #$3b,d0
trap #15
MODE_CHG5:
moveq.l #JOY_MAX-1,d4
move.w d4,d0
lsl.w #8,d0
lea.l JOY_DATA(pc),a2
adda.w d0,a2
lea.l SW_E+JOY_MAX(pc),a3
MODE_CHG6_1:
tst.b -(a3)
beq MODE_CHG6_2
move.w JOY_PLUS_EMU(a2),d3
moveq.l #$16,d2
moveq.l #$3b,d0
trap #15
MODE_CHG6_2:
lea.l -DATA_SIZE(a2),a2
dbra d4,MODE_CHG6_1
moveq.l #JOY_MAX-1,d4
move.w d4,d0
lsl.w #8,d0
lea.l JOY_DATA(pc),a2
adda.w d0,a2
lea.l SW_P+JOY_MAX(pc),a3
MODE_CHG7_1:
tst.b -(a3)
beq MODE_CHG7_2
move.w JOY_PLUS_EMU+2(a2),d3
moveq.l #$17,d2
moveq.l #$3b,d0
trap #15
MODE_CHG7_2:
lea.l -DATA_SIZE(a2),a2
dbra d4,MODE_CHG7_1
moveq.l #JOY_MAX-1,d4
move.w d4,d0
lsl.w #8,d0
lea.l JOY_DATA(pc),a2
adda.w d0,a2
lea.l SW_S+JOY_MAX(pc),a3
MODE_CHG8_1:
tst.b -(a3)
beq MODE_CHG8_2
move.w JOY_STASEL_MODE(a2),d3
moveq.l #$18,d2
moveq.l #$3b,d0
trap #15
MODE_CHG8_2:
lea.l -DATA_SIZE(a2),a2
dbra d4,MODE_CHG8_1
moveq.l #JOY_MAX-1,d4
moveq.l #$19,d2
moveq.l #0,d3
MODE_CHG9_1:
move.w d4,d0
lsl.w #8,d0
lea.l JOY_DATA+JOY_ONOFF_SU+32(pc),a2
adda.w d0,a2
move.w d4,d0
lsl.w #4,d0
lea.l SW_L+16(pc),a3
adda.w d0,a3
moveq.l #16-1,d5
MODE_CHG9_2:
move.w -(a2),d3
tst.b -(a3)
beq MODE_CHG9_3
moveq.l #$3b,d0
trap #15
MODE_CHG9_3:
dbra d5,MODE_CHG9_2
dbra d4,MODE_CHG9_1
rts
MODE_DSP:
clr.l a1
moveq.l #$81,d0
trap #15
move.l d0,-(a7)
pea MSG_DATA20(pc)
.dc.w $ff09
moveq.l #$ff,d1
moveq.l #$10,d2
moveq.l #$ff,d3
moveq.l #$3b,d0
trap #15
tst.w d0
beq MODE_DSP_1_2
cmpi.w #1,d0
bne MODE_DSP_1_1
pea MSG_DATA22(pc)
bra MODE_DSP_1_3
MODE_DSP_1_1:
pea MSG_DATA23(pc)
bra MODE_DSP_1_3
MODE_DSP_1_2:
pea MSG_DATA21(pc)
MODE_DSP_1_3:
.dc.w $ff09
pea MSG_DATA30(pc)
.dc.w $ff09
lea.l 12(a7),a7
moveq.l #JOY_MAX-1,d6
moveq.l #0,d5
MODE_DSP_2_1:
move.w d5,d1
moveq.l #$3b,d0
trap #15
moveq.l #$ff,d1
moveq.l #$02,d2
move.w d5,d3
moveq.l #$3b,d0
trap #15
lea.l MSG_DATA31(pc),a2
move.b d5,d0
addi.b #$30,d0
move.b d0,3(a2)
move.l a2,-(a7)
.dc.w $ff09
addq.w #4,a7
moveq.l #16-1,d1
lea.l JOY_ONOFF_SU+32(a1),a2
LENSHA_DISP_1:
moveq.l #$30,d0
tst.w -(a2)
beq LENSHA_DISP_2
moveq.l #$31,d0
LENSHA_DISP_2:
move.w d0,-(a7)
.dc.w $ff02
addq.w #2,a7
dbra d1,LENSHA_DISP_1
pea MSG_DATA32(pc)
.dc.w $ff09
tst.w JOY_CNV_MODE(a1)
beq MODE_DSP_3_1
pea MSG_DATA41(pc)
bra MODE_DSP_3_2
MODE_DSP_3_1:
pea MSG_DATA40(pc)
MODE_DSP_3_2:
.dc.w $ff09
addq.w #8,a7
pea MSG_DATA33(pc)
.dc.w $ff09
tst.w JOY_STASEL_MODE(a1)
beq MODE_DSP_4_1
pea MSG_DATA43(pc)
bra MODE_DSP_4_2
MODE_DSP_4_1:
pea MSG_DATA42(pc)
MODE_DSP_4_2:
.dc.w $ff09
addq.w #8,a7
pea MSG_DATA39(pc)
.dc.w $ff09
move.l JOY_PAD_TYPE(a1),d0
bmi MODE_DSP_5_1
andi.w #$00ff,d0
lea.l PAD_DISP_INFO(pc),a2
PAD_DISP_1:
move.l (a2)+,d1
bmi PAD_DISP_2
cmp.l d1,d0
beq PAD_DISP_2
addq.w #4,a2
bra PAD_DISP_1
PAD_DISP_2:
move.l (a2),-(a7)
bra MODE_DSP_5_2
MODE_DSP_5_1:
pea MSG_DATA47(pc)
MODE_DSP_5_2:
.dc.w $ff09
addq.w #8,a7
pea MSG_DATA34(pc)
.dc.w $ff09
tst.w JOY_PORT_NO(a1)
beq MODE_DSP_6_2
bpl MODE_DSP_6_1
pea MSG_DATA46(pc)
bra MODE_DSP_6_3
MODE_DSP_6_1:
pea MSG_DATA45(pc)
bra MODE_DSP_6_3
MODE_DSP_6_2:
pea MSG_DATA44(pc)
MODE_DSP_6_3:
.dc.w $ff09
addq.w #8,a7
pea MSG_DATA36(pc)
.dc.w $ff09
moveq.l #0,d1
lea.l MSG_DATA37(pc),a2
move.b JOY_PLUS_EMU+1(a1),d0
move.b d0,d1
lsr.b #4,d1
move.b DTOH_TBL(pc,d1.w),(a2)
andi.w #$000f,d0
move.b DTOH_TBL(pc,d0.w),1(a2)
move.l a2,(a7)
.dc.w $ff09
lea.l MSG_DATA38(pc),a2
move.b JOY_PLUS_EMU+3(a1),d0
move.b d0,d1
lsr.b #4,d1
move.b DTOH_TBL(pc,d1.w),(a2)
andi.w #$000f,d0
move.b DTOH_TBL(pc,d0.w),1(a2)
move.l a2,(a7)
.dc.w $ff09
addq.w #4,a7
addq.w #1,d5
dbra d6,MODE_DSP_2_1
moveq.l #$ff,d1
moveq.l #$13,d2
moveq.l #$ff,d3
moveq.l #$3b,d0
trap #15
tst.w d0
bne MODE_DSP_2_10
pea MSG_DATA25(pc)
bra MODE_DSP_2_11
MODE_DSP_2_10:
pea MSG_DATA24(pc)
MODE_DSP_2_11:
.dc.w $ff09
addq.w #4,a7
move.l (a7)+,d0
bmi MODE_DSP_END_1
movea.l d0,a1
moveq.l #$81,d0
trap #15
MODE_DSP_END_1:
rts
DTOH_TBL:
.dc.b '0'
.dc.b '1'
.dc.b '2'
.dc.b '3'
.dc.b '4'
.dc.b '5'
.dc.b '6'
.dc.b '7'
.dc.b '8'
.dc.b '9'
.dc.b 'A'
.dc.b 'B'
.dc.b 'C'
.dc.b 'D'
.dc.b 'E'
.dc.b 'F'
KEEP_CHK1:
movem.l d1-d2/a1,-(a7) * レジスタ保存
moveq.l #$ff,d1 * モード指定
moveq.l #1,d2 * 常駐状態取得
moveq.l #$3b,d0
trap #15
tst.l d0
beq KEEP_CHK1_1
move.l d0,a1
moveq.l #$84,d0
trap #15
cmpi.l #'JOYD',d0
bne KEEP_CHK1_2
moveq.l #$83,d0
trap #15
cmpi.w #'RV',d0
bne KEEP_CHK1_2
moveq.l #1,d0 * 常駐している
KEEP_CHK1_1:
movem.l (a7)+,d1-d2/a1 * レジスタ復帰
rts
KEEP_CHK1_2:
moveq.l #0,d0 * 常駐していない
bra KEEP_CHK1_1
KEEP_CHK2:
pea.l $0000.w
.dc.w $ff20
move.l d0,(a7)
KEEP_CHK2_1:
move.l (a0),d1
beq KEEP_CHK2_2
move.l d1,a0
cmpi.l #'JOYD',256+14(a0)
bne KEEP_CHK2_1
cmpi.w #'RV',256+18(a0)
bne KEEP_CHK2_1
moveq.l #1,d1
KEEP_CHK2_2:
.dc.w $ff20
addq.w #4,a7
move.l d1,d0
rts
KEEP_CHK3:
movem.l d1-d2/a1,-(a7) * レジスタ保存
moveq.l #$ff,d1 * モード指定
moveq.l #1,d2 * 常駐状態取得
moveq.l #$3b,d0
trap #15
tst.l d0
beq KEEP_CHK3_1
move.l d0,a1
moveq.l #$84,d0
trap #15
cmpi.l #'JOYD',d0
bne KEEP_CHK3_2
moveq.l #$83,d0
trap #15
cmpi.w #'RV',d0
bne KEEP_CHK3_2
addq.w #2,a1
moveq.l #$84,d0
trap #15
cmp.l KEEP_CHK_VER(pc),d0
bne KEEP_CHK3_2
moveq.l #1,d0 * 常駐している
KEEP_CHK3_1:
movem.l (a7)+,d1-d2/a1 * レジスタ復帰
rts
KEEP_CHK3_2:
moveq.l #0,d0 * 常駐していない
bra KEEP_CHK3_1
PARM_RTN2:
tst.b (a1)+
beq PARM_RTN2_2
PARM_RTN2_1:
move.b (a1)+,d0
beq PARM_RTN2_2
cmpi.b #' ',d0
beq PARM_RTN2_1
bsr PARM_SUB
tst.l d0
beq PARM_RTN2_1
rts
PARM_RTN2_2:
moveq.l #0,d0
rts
PARM_SUB:
cmpi.b #'/',d0
beq PARM_SUB_1
cmpi.b #'-',d0
bne PARM_SUB_ERR1
PARM_SUB_1:
move.b (a1)+,d0
beq PARM_SUB_ERR1
ori.b #$20,d0
cmpi.b #'m',d0
beq PARM_SUB_M
cmpi.b #'i',d0
beq PARM_SUB_I
cmpi.b #'r',d0
beq PARM_SUB_R
cmpi.b #'t',d0
beq PARM_SUB_T
cmpi.b #'e',d0
beq PARM_SUB_E
cmpi.b #'p',d0
beq PARM_SUB_P
cmpi.b #'d',d0
beq PARM_SUB_D
cmpi.b #'s',d0
beq PARM_SUB_S
cmpi.b #'l',d0
beq PARM_SUB_L
cmpi.b #'b',d0
bne PARM_SUB_ERR1
PARM_SUB_B:
move.b (a1)+,d1
subi.b #'0',d1
cmpi.b #JOY_MAX-1,d1
bhi PARM_SUB_ERR1
ext.w d1
move.b (a1),d0
beq PARM_SUB_B2
cmpi.b #' ',d0
beq PARM_SUB_B2
bsr READ_CNV_DATA
tst.l d0
bmi PARM_SUB_ERR2
moveq.l #1,d0
PARM_SUB_B1:
lea.l SW_B(pc),a2
st.b 0(a2,d1.w)
lea.l JOY_DATA(pc),a2
lsl.w #8,d1
adda.w d1,a2
move.w d0,JOY_CNV_MODE(a2)
moveq.l #0,d0
rts
PARM_SUB_B2:
moveq.l #0,d0
bra PARM_SUB_B1
PARM_SUB_T:
move.b (a1)+,d0
subi.b #'0',d0
cmpi.b #9,d0
bhi PARM_SUB_ERR1
ext.w d0
move.w d0,COM_DATA+COM_JOY1_MAX
st.b SW_T
moveq.l #0,d0
rts
PARM_SUB_E:
move.b (a1)+,d1
subi.b #'0',d1
cmpi.b #JOY_MAX-1,d1
bhi PARM_SUB_ERR1
ext.w d1
cmpi.b #',',(a1)+
bne PARM_SUB_ERR1
move.b (a1)+,d0
ori.b #$20,d0
subi.b #'0',d0
cmpi.b #9,d0
bls PARM_SUB_E1
subi.b #$31,d0
cmpi.b #5,d0
bhi PARM_SUB_ERR1
addi.b #10,d0
PARM_SUB_E1:
ext.w d0
lea.l SW_E(pc),a2
st.b 0(a2,d1.w)
lea.l JOY_DATA(pc),a2
lsl.w #8,d1
adda.w d1,a2
move.w d0,JOY_PLUS_EMU(a2)
moveq.l #0,d0
rts
PARM_SUB_P:
move.b (a1)+,d1
subi.b #'0',d1
cmpi.b #JOY_MAX-1,d1
bhi PARM_SUB_ERR1
ext.w d1
cmpi.b #',',(a1)+
bne PARM_SUB_ERR1
moveq.l #0,d2
move.b (a1)+,d2
subi.b #'0',d2
cmpi.b #7,d2
bhi PARM_SUB_ERR1
lsl.b #4,d2
move.b (a1)+,d0
ori.b #$20,d0
subi.b #'0',d0
cmpi.b #9,d0
bls PARM_SUB_P1
subi.b #$31,d0
cmpi.b #5,d0
bhi PARM_SUB_ERR1
addi.b #10,d0
PARM_SUB_P1:
or.b d0,d2
lea.l SW_P(pc),a2
st.b 0(a2,d1.w)
lea.l JOY_DATA(pc),a2
lsl.w #8,d1
adda.w d1,a2
move.w d2,JOY_PLUS_EMU+2(a2)
moveq.l #0,d0
rts
PARM_SUB_S:
move.b (a1)+,d1
subi.b #'0',d1
cmpi.b #JOY_MAX-1,d1
bhi PARM_SUB_ERR1
ext.w d1
cmpi.b #',',(a1)+
bne PARM_SUB_ERR1
move.b (a1)+,d0
ori.b #$20,d0
subi.b #'0',d0
cmpi.b #1,d0
bhi PARM_SUB_ERR1
ext.w d0
lea.l SW_S(pc),a2
st.b 0(a2,d1.w)
lea.l JOY_DATA(pc),a2
lsl.w #8,d1
adda.w d1,a2
move.w d0,JOY_STASEL_MODE(a2)
moveq.l #0,d0
rts
PARM_SUB_L:
move.b (a1)+,d1
subi.b #'0',d1
cmpi.b #JOY_MAX-1,d1
bhi PARM_SUB_ERR1
ext.w d1
cmpi.b #',',(a1)+
bne PARM_SUB_ERR1
move.b (a1)+,d2
ori.b #$20,d2
subi.b #'0',d2
cmpi.b #9,d2
bls PARM_SUB_L1
subi.b #$31,d2
cmpi.b #5,d2
bhi PARM_SUB_ERR1
addi.b #10,d2
PARM_SUB_L1:
ext.w d2
cmpi.b #',',(a1)+
bne PARM_SUB_ERR1
move.b (a1)+,d3
ori.b #$20,d3
subi.b #'0',d3
cmpi.b #9,d3
bls PARM_SUB_L2
subi.b #$31,d3
cmpi.b #5,d3
bhi PARM_SUB_ERR1
addi.b #10,d3
PARM_SUB_L2:
lsl.w #4,d3
move.b (a1)+,d0
ori.b #$20,d0
subi.b #'0',d0
cmpi.b #9,d0
bls PARM_SUB_L3
subi.b #$31,d0
cmpi.b #5,d0
bhi PARM_SUB_ERR1
addi.b #10,d0
PARM_SUB_L3:
or.b d0,d3
lsl.w #8,d3
cmpi.b #',',(a1)+
bne PARM_SUB_ERR1
move.b (a1)+,d3
ori.b #$20,d3
subi.b #'0',d3
cmpi.b #9,d3
bls PARM_SUB_L4
subi.b #$31,d3
cmpi.b #5,d3
bhi PARM_SUB_ERR1
addi.b #10,d3
PARM_SUB_L4:
lsl.b #4,d3
move.b (a1)+,d0
ori.b #$20,d0
subi.b #'0',d0
cmpi.b #9,d0
bls PARM_SUB_L5
subi.b #$31,d0
cmpi.b #5,d0
bhi PARM_SUB_ERR1
addi.b #10,d0
PARM_SUB_L5:
or.b d0,d3
lea.l SW_L(pc),a2
move.w d1,d0
lsl.w #4,d0
add.w d2,d0
st.b 0(a2,d0.w)
lea.l JOY_DATA(pc),a2
lsl.w #8,d1
add.w d2,d1
add.w d2,d1
adda.w d1,a2
move.w d3,JOY_ONOFF_SU(a2)
moveq.l #0,d0
rts
PARM_SUB_R:
st.b SW_R
moveq.l #0,d0
rts
PARM_SUB_M:
move.b (a1)+,d0
subi.b #'0',d0
cmpi.b #2,d0
bhi PARM_SUB_ERR1
ext.w d0
move.w d0,COM_DATA+COM_HANTEI_MODE
st.b SW_M
moveq.l #0,d0
rts
PARM_SUB_I:
move.b (a1)+,d0
subi.b #'0',d0
cmpi.b #1,d0
bhi PARM_SUB_ERR1
ext.w d0
move.w d0,COM_DATA+COM_IOCS3B_OUT
st.b SW_I
moveq.l #0,d0
rts
PARM_SUB_D:
st.b SW_D
moveq.l #0,d0
rts
PARM_SUB_ERR2:
pea MSG_DATA11(pc)
.dc.w $ff09
addq.w #4,a7
PARM_SUB_ERR1:
moveq.l #$ff,d0
rts
READ_CNV_DATA:
movem.l d1/a2,-(a7)
clr.w -(a7)
move.l a1,-(a7)
READ_CNV_DATA_1:
move.b (a1)+,d0
beq READ_CNV_DATA_2
cmpi.b #' ',d0
bne READ_CNV_DATA_1
clr.b -(a1)
.dc.w $ff3d
move.b #' ',(a1)
bra READ_CNV_DATA_5
READ_CNV_DATA_2:
subq.w #1,a1
.dc.w $ff3d
READ_CNV_DATA_5:
addq.w #6,a7
tst.l d0
bmi READ_CNV_DATA_3
pea.l $0032.w
lsl.w #8,d1
lea.l JOY_DATA+JOY_CNV_DATA(pc),a2
pea 0(a2,d1.w)
move.w d0,-(a7)
.dc.w $ff3f
move.l d0,d1
.dc.w $ff3e
lea.l 10(a7),a7
move.l d1,d0
bmi READ_CNV_DATA_3
cmpi.l #32,d1
bcs READ_CNV_DATA_4
moveq.l #0,d0
READ_CNV_DATA_3:
movem.l (a7)+,d1/a2
rts
READ_CNV_DATA_4:
moveq.l #$ff,d0
bra READ_CNV_DATA_3
.data
PAD_DISP_INFO:
.dc.l PAD_TYPE_ATARI*65536,MSG_DATA_PAD_ATARI
.dc.l PAD_TYPE_MD*65536+$00,MSG_DATA_PAD_MD3
.dc.l PAD_TYPE_MD*65536+$01,MSG_DATA_PAD_MD6
.dc.l PAD_TYPE_MD*65536+$0f,MSG_DATA_PAD_MDNC
.dc.l PAD_TYPE_SS*65536+$00,MSG_DATA_PAD_SSD
.dc.l PAD_TYPE_SS*65536+$01,MSG_DATA_PAD_SSA
.dc.l PAD_TYPE_SS*65536+$0f,MSG_DATA_PAD_SSNC
.dc.l PAD_TYPE_PS*65536+$01,MSG_DATA_PAD_PSMOUSE
.dc.l PAD_TYPE_PS*65536+$02,MSG_DATA_PAD_PSA1
.dc.l PAD_TYPE_PS*65536+$04,MSG_DATA_PAD_PSD
.dc.l PAD_TYPE_PS*65536+$05,MSG_DATA_PAD_PSA2
.dc.l PAD_TYPE_PS*65536+$07,MSG_DATA_PAD_PSA2
.dc.l PAD_TYPE_PS*65536+$0e,MSG_DATA_PAD_PSJOGCON
.dc.l PAD_TYPE_PS*65536+$0f,MSG_DATA_PAD_PSNC
.dc.l $ffffffff,MSG_DATA_PAD_UNKNOW
SW_L:
.dcb.b 16,0
.dcb.b 16,0
.dcb.b 16,0
.dcb.b 16,0
.dcb.b 16,0
.dcb.b 16,0
.dcb.b 16,0
SW_D:
.dc.b 0
SW_I:
.dc.b 0
SW_R:
.dc.b 0
SW_M:
.dc.b 0
SW_T:
.dc.b 0
SW_S:
.dcb.b JOY_MAX,0
SW_E:
.dcb.b JOY_MAX,0
SW_P:
.dcb.b JOY_MAX,0
SW_B:
.dcb.b JOY_MAX,0
.even
TITLE:
.dc.b $0d,$0a
.dc.b 'JOYSTICK DRIVER for X680x0 version 2.20',$0d,$0a
.dc.b 'Copyright 1994-99 by HUYE',$0d,$0a,0
TITLE2:
.dc.b 'CPSF-PCアダプタ、MD変換コネクタの使用が可能です',$0d,$0a,0
TITLE3:
.dc.b '<usage> JOYDRV.X [option]',$0d,$0a
.dc.b '<option>',$0d,$0a
.dc.b ' /M0 .. MDマルチタップ及びSS,PS接続ケーブルを使用不可にする',$0d,$0a
.dc.b ' /M1 .. MDマルチタップ及びSS,PS接続ケーブルを使用可能にする(キャッシュ無し)',$0d,$0a
.dc.b ' /M2 .. MDマルチタップ及びSS,PS接続ケーブルを使用可能にする(キャッシュ有り)(def.)',$0d,$0a
.dc.b ' /B? .. ビット変換無し(?はジョイスティック番号 0~6)(def.)',$0d,$0a
.dc.b ' /B?ファイル名 .. ビット変換有り(ファイル名は、変換データを格納しているファイル、',$0d,$0a
.dc.b ' ?はジョイスティック番号 0~6)',$0d,$0a
.dc.b ' /I0 .. ROM IOCS互換モード',$0d,$0a
.dc.b ' /I1 .. JOYDRV拡張モード(def.)',$0d,$0a
.dc.b ' /T? .. マルチタップ使用時のマルチタップの最大パッド数(?は、0~9)(def.=',$2f+JOY_MAX,')',$0d,$0a
.dc.b ' /E?,? .. アナログスティックの十字キーエミュレート指定',$0d,$0a
.dc.b ' 1つ目の?は、ジョイスティック番号 0~6',$0d,$0a
.dc.b ' 2つ目の?は、0~F(def.=3)',$0d,$0a
.dc.b ' /P?,?? .. 十字キーエミュレート時のしきい値指定',$0d,$0a
.dc.b ' 1つ目の?は、ジョイスティック番号 0~6',$0d,$0a
.dc.b ' 2つ目の??は、00~7F(def.=4F)',$0d,$0a
.dc.b ' /S?,? .. START,SELECTボタンの動作モード指定',$0d,$0a
.dc.b ' 1つ目の?は、ジョイスティック番号 0~6',$0d,$0a
.dc.b ' 2つ目の?は、0で通常モード、1でFM-TOWNSモード(def.=0)',$0d,$0a
.dc.b ' /L?,?,??,?? .. 連射モード指定',$0d,$0a
.dc.b ' 1つ目の?は、ジョイスティック番号 0~6',$0d,$0a
.dc.b ' 2つ目の?は、ビット位置 0~F',$0d,$0a
.dc.b ' 3つ目の??は、連射時のON回数 00~FF',$0d,$0a
.dc.b ' 4つ目の??は、連射時のOFF回数 00~FF',$0d,$0a
.dc.b ' ON回数とOFF回数の両方に00を設定すると連射モードが解除されます',$0d,$0a
.dc.b ' /D .. 設定状態の表示禁止',$0d,$0a
.dc.b ' /R .. 常駐解除(コマンドラインからの実行時のみ有効)',$0d,$0a
.dc.b '/は-でも可、アルファベットは小文字も可',$0d,$0a,0
MSG_DATA1:
.dc.b 'JOYDRVは既に登録されています',$0d,$0a,0
MSG_DATA2:
.dc.b 'JOYDRVは既に常駐しています',$0d,$0a,0
MSG_DATA3:
.dc.b 'JOYDRVは常駐していません',$0d,$0a,0
MSG_DATA4:
.dc.b 'JOYDRVは常駐しました',$0d,$0a,0
MSG_DATA5:
.dc.b 'JOYDRVの常駐を解除しました',$0d,$0a,0
MSG_DATA6:
.dc.b 'IOCS$3Bのベクタが変更されているかJOYDRVのバージョンが違うので常駐が解除できません',$0d,$0a,0
MSG_DATA10:
.dc.b 'パラメータ指定に誤りがあります',$0d,$0a,0
MSG_DATA11:
.dc.b '変換データファイルの読み込みに失敗しました',$0d,$0a,0
MSG_DATA20:
.dc.b 'MDマルチタップ及びSS,PSパッド接続ケーブルは使用',0
MSG_DATA21:
.dc.b 'できません',$0d,$0a,0
MSG_DATA22:
.dc.b '可能です(キャッシュ無し)',$0d,$0a,0
MSG_DATA23:
.dc.b '可能です(キャッシュ有り)',$0d,$0a,0
MSG_DATA24:
.dc.b 'JOYDRV拡張モードで動作しています',$0d,$0a,0
MSG_DATA25:
.dc.b 'ROM IOCS互換モードで動作しています',$0d,$0a,0
MSG_DATA30:
.dc.b 'JOY番号 連射モード ビット変換 スタートセレクトモード パッドタイプ 接続 十字キーエミュレート しきい値',$0d,$0a,0
MSG_DATA31:
.dc.b ' '
.dc.b '0 ',0
MSG_DATA32:
.dc.b ' ',0
MSG_DATA33:
.dc.b ' ',0
MSG_DATA34:
.dc.b ' ',0
MSG_DATA36:
.dc.b ' ',0
MSG_DATA37:
.dc.b '03 ',0
MSG_DATA38:
.dc.b '4F',$0d,$0a,0
MSG_DATA39:
.dc.b ' ',0
MSG_DATA40:
.dc.b '無し',0
MSG_DATA41:
.dc.b '有り',0
MSG_DATA42:
.dc.b '通常 ',0
MSG_DATA43:
.dc.b 'FM-TOWNS ',0
MSG_DATA44:
.dc.b 'PORT1',0
MSG_DATA45:
.dc.b 'PORT2',0
MSG_DATA46:
.dc.b '-----',0
MSG_DATA47:
.dc.b '---------',0
MSG_DATA_PAD_UNKNOW:
.dc.b '不明 ',0
MSG_DATA_PAD_ATARI:
.dc.b 'アタリ ',0
MSG_DATA_PAD_MD3:
.dc.b 'メガドラ3B ',0
MSG_DATA_PAD_MD6:
.dc.b 'メガドラ6B ',0
MSG_DATA_PAD_MDNC:
.dc.b 'メガドラN.C',0
MSG_DATA_PAD_SSD:
.dc.b 'SSデジタル ',0
MSG_DATA_PAD_SSA:
.dc.b 'SSアナログ ',0
MSG_DATA_PAD_SSNC:
.dc.b 'SS N.C. ',0
MSG_DATA_PAD_PSD:
.dc.b 'PSデジタル ',0
MSG_DATA_PAD_PSA2:
.dc.b 'PSアナログ2 ',0
MSG_DATA_PAD_PSA1:
.dc.b 'PSアナログ1 ',0
MSG_DATA_PAD_PSMOUSE:
.dc.b 'PSマウス ',0
MSG_DATA_PAD_PSJOGCON:
.dc.b 'PSジョグコン',0
MSG_DATA_PAD_PSNC:
.dc.b 'PS N.C. ',0
.end MAIN